Ich bin ziemlich neu im Codieren im Allgemeinen und wirklich neu im Xcode (Swift). Ich verstehe, dass ich eine Feder oder eine Klasse registrieren muss, aber ich verstehe nicht, wo oder wie?
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)
}
}
}
}
Antworten:
Haben Sie in Ihrem Storyboard die Tabellenzellen-ID auf "Zelle" gesetzt?
Oder haben Sie die Klasse für
UITableViewController
Ihre Klasse in dieser Szene festgelegt?quelle
Sie können eine Klasse für
UITableViewCell
diese wie folgt anmelden :Mit Swift 3+:
Mit Swift 2.2:
Stellen Sie sicher, dass dieselbe Kennung "
cell
" auch in Ihr Storyboard kopiert wirdUITableViewCell
."
self
" dient dazu, dass die Klasse den Klassennamen gefolgt von verwendet.self
.quelle
viewDidLoad()
tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
Das hat bei mir funktioniert, kann dir auch helfen:
Swift 4+:
Swift 3 :
Swift 2.2 :
quelle
Ich hatte heute dieses Problem, das durch Auswahl von Produkt -> Reinigen behoben wurde. Ich war so verwirrt, da mein Code korrekt war. Das Problem begann damit, Befehl-Z zu oft zu verwenden :)
quelle
In meinem Fall habe ich dieses Problem gelöst, indem ich es in der Eigenschaft "Identifier" von Table View Cell benannt habe:
Vergessen Sie nicht: in Ihrer Klasse zu deklarieren: UITableViewDataSource
quelle
Ziehen Sie einfach eine Zelle (wie bei TableViewController) und fügen Sie sie hinzu, indem Sie die Zelle in TableViewController freigeben. Klicken Sie auf die Zelle und gehen Sie zu ihrem Attributinspektor und setzen Sie ihre Kennung als "Zelle". Hoffentlich funktioniert es.
Vergessen Sie nicht, dass Sie eine Kennung im Attributinspektor haben möchten .
( NICHT die "Wiederherstellungs-ID" im "Identity Inspector"!)
quelle
Ein weiterer Grund für dieses Problem ist ein früheres Problem. Wenn Sie einen neuen ViewController anzeigen und den ViewController direkt instanziieren, werden die Prototypzellen natürlich nicht aus dem StoryBoard geladen. Die richtige Lösung sollte immer darin bestehen, den View Controller wie folgt über das Storyboard zu instanziieren:
quelle
Passen Sie den Bezeichnernamen an beiden Stellen an
Dieser Fehler tritt auf, wenn sich der Bezeichnername der Tabellenzelle in der Swift-Datei und im Storyboard unterscheidet.
1) Die Swift-Datei
2) Das Storyboard
quelle
Registrieren Sie in Swift 3.0 eine Klasse für Ihre UITableViewCell wie folgt:
quelle
Ich hatte das gleiche Problem. Dieses Problem hat bei mir funktioniert. Wählen Sie im Storyboard Ihre Tabellenansicht aus und ändern Sie sie von statischen Zellen in dynamische Zellen.
quelle
Wenn Sie Ihre Zelle über den Interface Builder definiert haben, platzieren Sie eine Zelle in Ihrer
UICollectionView
oderUITableView
:Stellen Sie sicher, dass Sie die Zelle mit einer von Ihnen erstellten Klasse verbunden haben, und sehr wichtig, dass Sie "Modul vom Ziel erben" aktiviert haben.
quelle
Früher arbeitete es mit Swift 3 und Swift 4, aber jetzt funktioniert es nicht mehr.
mögen
Also habe ich die meisten der oben genannten Lösungen in Swift 5 ausprobiert, aber kein Glück bekommen.
Schließlich habe ich diese Lösung ausprobiert und es hat bei mir funktioniert.
quelle
Mein Problem war, dass ich die Tabellenansichtszelle asynchron in der Versandwarteschlange registrierte. Wenn Sie die Quelle der Tabellenansicht registriert und die Referenz im Storyboard delegiert haben, verzögert die Versandwarteschlange die Registrierung der Zelle, da der Name dies asynchron andeutet und Ihre Tabellenansicht nach den Zellen sucht.
Entweder sollten Sie die Versandwarteschlange nicht für die Registrierung verwenden, ODER Sie tun dies:
quelle
Ich habe gerade das gleiche Problem getroffen und sehe diesen Beitrag. Für mich liegt es daran, dass ich vergessen habe, die Kennung der Zelle festzulegen, auch wie in anderen Antworten erwähnt. Was ich sagen möchte ist, dass wenn Sie das Storyboard zum Laden einer benutzerdefinierten Zelle verwenden, wir die Zelle der Tabellenansicht nicht im Code registrieren müssen, was andere Probleme verursachen kann.
Siehe diesen Beitrag für Details:
Benutzerdefinierte Tabellenansichtszelle: IBOutlet-Label ist Null
quelle
Nur für diejenigen, die neu bei iOS-Freunden sind (wie ich), die sich für mehrere Zellen und eine andere xib-Datei entschieden haben, besteht die Lösung nicht darin, eine Kennung zu haben, sondern dies zu tun:
hier News ist xib Dateinamen.
quelle
Swift 5
Sie müssen die UINib- Methode verwenden, um die Zelle in viewDidLoad zu registrieren
quelle
Wählen Sie im Feld "Unterklasse von" die Option UITableViewController aus.
Der Klassentitel ändert sich in xxxxTableViewController. Lass das so wie es ist.
Stellen Sie sicher, dass die Option "Auch XIB-Datei erstellen" ausgewählt ist.
quelle
Ich bin auf diese Nachricht gestoßen, als UITableView im IB mit Cmd-C - Cmd-V in eine andere Unteransicht verschoben wurde.
Alle Bezeichner, Delegierungsmethoden, Links im IB usw. bleiben erhalten, aber zur Laufzeit wird eine Ausnahme ausgelöst.
Die einzige Lösung besteht darin, alle Tinten, die sich auf die Tabellenansicht im IB beziehen (Outlet, Datenquelle, Delegat), zu löschen und erneut zu erstellen.
quelle