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)
}
}
}
}
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?
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
.
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.
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 :)
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é"!)
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")
Dans Swift 3.0, enregistrez une classe pour votre UITableViewCell comme ceci:
tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")
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".
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.
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
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()
}
identifiant de variable statique: String {return String (décrivant: self)}
static var nib : UINib {
return UINib(nibName: identifier, bundle: nil)
}
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")
}
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.
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")
}
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.