Je suis assez nouveau dans le codage en général et vraiment nouveau sur Xcode (Swift). Je comprends que j'ai besoin d'enregistrer une plume ou une classe mais je ne comprends pas «où ni 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)
}
}
}
}
Réponses:
Avez-vous défini l' identificateur de cellule de tableau sur "Cellule" dans votre storyboard?
Ou avez-vous défini la classe pour
UITableViewController
votre classe dans cette scène?la source
Vous pouvez enregistrer une classe pour votre
UITableViewCell
comme ceci:Avec Swift 3+:
Avec Swift 2.2:
Assurez-vous que le même identifiant "
cell
" est également copié dans votre storyboardUITableViewCell
."
self
" sert à faire en sorte que la classe utilise le nom de la classe suivi de.self
.la source
viewDidLoad()
tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
Cela a fonctionné pour moi, peut vous aider aussi:
Swift 4+:
Swift 3 :
Swift 2.2 :
la source
J'ai eu ce problème aujourd'hui qui a été résolu en sélectionnant Produit -> Nettoyer. J'étais tellement confus car mon code était correct. Le problème a commencé en utilisant trop souvent la commande-Z :)
la source
y mon cas, j'ai résolu ce problème en le nommant dans la propriété "Identifier" de la cellule de vue tableau:
N'oubliez pas: à déclarer dans votre classe: UITableViewDataSource
la source
Faites simplement glisser une cellule (comme vous l'avez fait pour TableViewController) et ajoutez-y simplement en libérant la cellule sur TableViewController. Cliquez sur la cellule et allez à son inspecteur d'attributs et définissez son identifiant comme "Cellule". J'espère que cela fonctionne.
N'oubliez pas que vous voulez un identifiant sur l' inspecteur d'attributs .
( PAS le "ID de restauration" sur "l'inspecteur d'identité"!)
la source
Une autre raison pour laquelle ce problème se produit est un problème antérieur. Lors de l'affichage d'un nouveau ViewController, l'instanciation directe du ViewController cible ne chargera bien sûr pas les cellules prototypes du StoryBoard. La solution correcte doit toujours être d'instancier le contrôleur de vue via le storyboard comme ceci:
la source
Faites correspondre le nom de l'identifiant aux deux endroits
Cette erreur se produit lorsque le nom d'identificateur de la table est différent dans le fichier Swift et dans le Storyboard.
1) Le fichier Swift
2) Le Storyboard
la source
Dans Swift 3.0, enregistrez une classe pour votre UITableViewCell comme ceci:
la source
J'ai eu le même problème. Ce problème a fonctionné pour moi. Dans le storyboard, sélectionnez votre vue de tableau et changez-la de cellules statiques en cellules dynamiques.
la source
Si vous avez défini votre cellule via Interface Builder, en plaçant une cellule à l'intérieur de votre
UICollectionView
, ouUITableView
:Assurez-vous que vous avez lié la cellule avec une classe réelle que vous avez créée, et très important, que vous avez coché "Hériter le module de la cible"
la source
Il fonctionnait auparavant sur Swift 3 et Swift 4, mais maintenant il ne fonctionne pas.
comme
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.
la source
Mon problème était que j'enregistrais de manière asynchrone la cellule de vue de la table dans la file d'attente de distribution. Si vous avez enregistré la source de 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 car le nom le suggère, cela se produira de manière asynchrone et votre vue de table recherche les cellules.
Soit vous ne devez pas utiliser la file d'attente de répartition pour l'enregistrement, soit procédez comme suit:
la source
Je viens de rencontrer le même problème et voir ce post. Pour moi, c'est parce que j'ai oublié l'ensemble de l'identifiant de la cellule, également comme 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, nous n'avons pas besoin d'enregistrer la cellule de vue de tableau dans le code, ce qui peut causer d'autres problèmes.
Voir cet article pour plus de détails:
Cellule de vue de tableau personnalisée: l'étiquette IBOutlet est nulle
la source
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:
ici newsDetails est le nom du fichier xib.
la source
Swift 5
vous devez utiliser la méthode UINib pour enregistrer la cellule dans viewDidLoad
la source
Dans le champ «Sous-classe de», sélectionnez UITableViewController.
Le titre de la classe devient xxxxTableViewController. Laissez cela tel quel.
Assurez-vous que l'option «Créer également un fichier XIB» est sélectionnée.
la source
Je suis tombé sur ce message lorsque UITableView dans l'IB a été déplacé dans une autre sous-vue avec Cmd-C - Cmd-V.
Tous les identifiants, méthodes de délégué, liens dans l'IB, etc. restent intacts, mais une exception est déclenchée au moment de l'exécution.
La seule solution est d'effacer toutes les encres, liées à la vue de table dans l'IB (sortie, source de données, délégué) et de les refaire.
la source