web-dev-qa-db-fra.com

impossible de retirer de la file d'attente une cellule avec identificateur Cellule - doit enregistrer un nib ou une classe pour l'identificateur ou connecter une cellule prototype dans un storyboard

Je suis assez nouveau pour le codage en général et vraiment nouveau pour Xcode (Swift). Je comprends que je dois enregistrer une plume ou un cours, mais je ne comprends pas "où ou comment?".

import UIKit

class NotesListViewController: UITableViewController {

    @IBOutlet weak var menuButton: UIBarButtonItem!

  override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self,
      selector: "preferredContentSizeChanged:",
      name: UIContentSizeCategoryDidChangeNotification,
      object: nil)

    // Side Menu

    if self.revealViewController() != nil {
        menuButton.target = self.revealViewController()
        menuButton.action = "revealToggle:"
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }

  }

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // whenever this view controller appears, reload the table. This allows it to reflect any changes
    // made whilst editing notes
    tableView.reloadData()
  }

  func preferredContentSizeChanged(notification: NSNotification) {
    tableView.reloadData()
  }

  // #pragma mark - Table view data source

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
  }

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return notes.count
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath   indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    let note = notes[indexPath.row]
    let font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    let textColor = UIColor(red: 0.175, green: 0.458, blue: 0.831, alpha: 1)
    let attributes = [
      NSForegroundColorAttributeName : textColor,
      NSFontAttributeName : font,
      NSTextEffectAttributeName : NSTextEffectLetterpressStyle
    ]
    let attributedString = NSAttributedString(string: note.title, attributes: attributes)

    cell.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)

    cell.textLabel?.attributedText = attributedString

    return cell
  }

  let label: UILabel = {
    let temporaryLabel = UILabel(frame: CGRect(x: 0, y: 0, width: Int.max, height: Int.max))
    temporaryLabel.text = "test"
    return temporaryLabel
    }()

  override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    label.sizeToFit()
    return label.frame.height * 1.7
  }

  override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
      notes.removeAtIndex(indexPath.row)
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
  }

  // #pragma mark - Navigation

  // In a storyboard-based application, you will often want to do a little preparation before navigation
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let editorVC = segue.destinationViewController as? NoteEditorViewController {

      if "CellSelected" == segue.identifier {
        if let path = tableView.indexPathForSelectedRow() {
          editorVC.note = notes[path.row]
        }
      } else if "AddNewNote" == segue.identifier {
        let note = Note(text: " ")
        editorVC.note = note
        notes.append(note)
      }
    }
  }

}
94
ShizukaNaHaji

Avez-vous défini l'identifiant Table Cell sur "Cell" dans votre storyboard?

Ou avez-vous défini la classe pour le UITableViewController dans votre classe dans cette scène?

67
Race B

Vous pouvez enregistrer une classe pour votre UITableViewCell comme ceci:

Avec Swift 3 +:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

avec Swift 2.2:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

Assurez-vous que le même identifiant "cell" est également copié sur le UITableViewCell de votre storyboard.

"self" sert à obtenir que la classe utilise le nom de la classe suivi de .self.

92
Aks

Cela a fonctionné pour moi, peut vous aider aussi:

Swift 4+:

self.tableView.register(UITableViewCell.self, forCellWithReuseIdentifier: "cell")

Swift 3 :

self.tableView.register(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")

Swift 2.2 :

self.tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")

Nous devons définir la propriété Identifier sur la cellule d'affichage de la table, comme indiqué dans l'image ci-dessous.

enter image description here

27
Jaywant Khedkar

J'ai eu ce problème aujourd'hui qui a été résolu en sélectionnant Produit -> Nettoyer. J'étais tellement confus que mon code était correct. Le problème a commencé à utiliser trop souvent la commande-Z :)

23
MacInnis

mon cas, j’ai résolu le problème en le nommant dans la propriété "Identifier" de la cellule de la vue tableau:

enter image description here

N'oubliez pas: de déclarer dans votre classe: UITableViewDataSource

 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell
18
xhinoda

Faites simplement glisser une cellule (comme vous l'avez fait pour TableViewController) et ajoutez-y simplement en relâchant la cellule sur TableViewController. Cliquez sur la cellule et accédez à son inspecteur d'attributs et définissez son identifiant sur "Cellule". Espérons que cela fonctionne.


N'oubliez pas que vous voulez Identifiant sur le Inspecteur d'attributs.

(NOT l'identifiant de "restauration" de "l'inspecteur d'identité"!)

9
LC 웃

Une autre raison de ce problème est un problème antérieur. Lors de l'affichage d'un nouveau ViewController, l'instanciation directe du ViewController cible ne chargera évidemment pas les cellules prototypes à partir de StoryBoard. La solution correcte devrait toujours être d’instancier le contrôleur de vue à travers le story-board de la manière suivante:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")
6
Peter Honeder

Dans Swift 3.0, enregistrez une classe pour votre UITableViewCell comme ceci:

tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")
4
ak_ninan

Si vous avez défini votre cellule via Interface Builder, en insérant une cellule dans votre UICollectionView ou UITableView:

Assurez-vous de lier la cellule à une classe que vous avez créée et très important, cochez la case "Hériter du module de la cible".

1
Scaraux

J'ai eu le même problème. Ce problème a fonctionné pour moi. Dans le storyboard, sélectionnez votre vue tableau et changez-la de cellules statiques en cellules dynamiques.

1
Reza Dehnavi

Je viens de rencontrer le même problème et voir ce post. Pour moi, c’est parce que j’ai oublié l’identifiant de la cellule, également mentionné dans d’autres réponses. Ce que je veux dire, c'est que si vous utilisez le storyboard pour charger une cellule personnalisée, vous n'avez pas besoin d'enregistrer la cellule d'affichage de la table dans le code, ce qui peut entraîner d'autres problèmes.

Voir ce post pour plus de détails:

Cellule de vue de tableau personnalisée: l'étiquette IBOutlet est nulle

1
Maria Chen

Mon problème était que j'enregistrais de manière asynchrone la cellule de la vue table dans la file d'attente de répartition. Si vous avez enregistré la source de la vue de table et délégué la référence dans le storyboard, la file d'attente de distribution retarderait l'enregistrement de la cellule, comme son nom le suggère, cela se produira de manière asynchrone et votre vue de table recherche les cellules.

DispatchQueue.main.async {
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}

Soit vous ne devez pas utiliser la file d’attribution pour l’enregistrement OR procédez comme suit:

DispatchQueue.main.async {
    self.tableView.dataSource = self
    self.tableView.delegate = self
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}
1
Noor Ali Butt

identifiant de variable statique: String {return String (décrivant: self)}

static var nib : UINib {
    return UINib(nibName: identifier, bundle: nil)
}
0
hiren

Auparavant, il travaillait sur Swift 3 et Swift 4 mais maintenant, il ne fonctionne plus.

comme

self.tableView.register(MyTestTableViewCell.self, forCellReuseIdentifier: "cell")

J'ai donc essayé la plupart des solutions mentionnées ci-dessus dans Swift 5 mais je n'ai pas eu de chance.

Enfin, j'ai essayé cette solution et cela a fonctionné pour moi.

override func viewDidLoad() 
{

    tableView.register(UINib.init(nibName: "MyTestTableViewCell", bundle: nil), forCellReuseIdentifier: "myTestTableViewCell")
}
0
ABS

Juste pour les nouveaux amis iOS (comme moi) qui ont décidé d'avoir plusieurs cellules et dans un fichier xib différent, la solution n'est pas d'avoir un identifiant, mais de faire ceci:

let cell = Bundle.main.loadNibNamed("newsDetails", owner: self, options: nil)?.first as! newsDetailsTableViewCell

here newsDetails est le nom du fichier xib.

0
androCoder-BD

Swift 5

vous devez utiliser la méthode INib pour enregistrer une cellule dans viewDidLoad

override func viewDidLoad() 
{
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //register table view cell        
    tableView.register(UINib.init(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomTableViewCell")
}
0
swiftBoy

Dans le champ "Subclass of", sélectionnez UITableViewController.

Le titre de la classe devient xxxxTableViewController. Laissez ça tel quel.

Assurez-vous que l'option "Créer également un fichier XIB" est sélectionnée.

0
Donbosco Muthiani