Ich versuche, eine benutzerdefinierte Tabellenansichtszelle aus einer Schreibfeder zu erstellen. Ich beziehe mich auf diesen Artikel hier . Ich stehe vor zwei Problemen.
Ich habe eine .xib-Datei mit einem darauf gezogenen UITableViewCell-Objekt erstellt. Ich habe eine Unterklasse von erstellt UITableViewCell
und sie als Klasse der Zelle und Zelle als wiederverwendbaren Bezeichner festgelegt.
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
Im UITableViewController habe ich diesen Code,
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
Dieser Code ist fehlerfrei, aber wenn ich ihn im Simulator ausführe, sieht er so aus.
Im UITableViewController im Storyboard habe ich nichts mit der Zelle gemacht. Leere Kennung und keine Unterklasse. Ich habe versucht, die Zellkennung zur Prototypzelle hinzuzufügen, und sie erneut ausgeführt, aber ich erhalte das gleiche Ergebnis.
Ein weiterer Fehler, mit dem ich konfrontiert war, war der Versuch, die folgende Methode im UITableViewController zu implementieren.
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
Wie in dem Artikel gezeigt, den ich erwähnt habe, habe ich die Typform des cell
Parameters geändert, UITableViewCell
in CustomOneCell
die meine Unterklasse von UITableViewCell ist. Aber ich bekomme folgenden Fehler:
Überschreibende Methode mit Selektor 'tableView: willDisplayCell: forRowAtIndexPath:' hat inkompatiblen Typ '(UITableView!, CustomOneCell!, NSIndexPath!) -> ()'
Hat jemand eine Idee, wie man diese Fehler behebt? Diese schienen in Objective-C gut zu funktionieren.
Danke dir.
BEARBEITEN: Mir ist gerade aufgefallen, dass die Zellen angezeigt werden, wenn ich die Ausrichtung des Simulators auf Querformat ändere und wieder auf Hochformat umstelle! Ich konnte immer noch nicht herausfinden, was los ist. Ich lud ein Xcode - Projekt hier demonstriert das Problem , wenn Sie Zeit für einen kurzen Blick.
quelle
Hier ist mein Ansatz mit Swift 2 und Xcode 7.3. In diesem Beispiel wird ein einzelner ViewController zum Laden von zwei .xib-Dateien verwendet - eine für eine UITableView und eine für die UITableCellView.
In diesem Beispiel können Sie eine UITableView direkt in eine leere TableNib .xib-Datei ablegen. Legen Sie im Inneren den Dateieigentümer auf Ihre ViewController-Klasse fest und verwenden Sie einen Ausgang, um auf die tableView zu verweisen.
und
Jetzt können Sie in Ihrem View Controller die tableView wie gewohnt delegieren
Um Ihre benutzerdefinierte Zelle erneut zu erstellen, legen Sie ein Tabellenansichtszellenobjekt in einer leeren TableCellNib .xib-Datei ab. Dieses Mal müssen Sie in der .xib-Zellendatei keinen "Eigentümer" angeben, aber Sie müssen eine benutzerdefinierte Klasse und einen Bezeichner wie "TableCellId" angeben.
Erstellen Sie Ihre Unterklasse mit den gewünschten Verkaufsstellen
Endlich ... zurück in Ihrem View Controller können Sie das Ganze so laden und anzeigen
Der Code zeigt, wie Sie einfach eine Nib-Datei (die Tabelle) laden und anzeigen können, und zweitens, wie Sie eine Nib für die Verwendung in Zellen registrieren.
Hoffe das hilft!!!
quelle
let tableCellId = "myAwesomeCell"
. Ich habe ein weiteres Bild hinzugefügt, um Ihnen zu helfen.Swift 4
Registrieren Sie Nib
In TableView DataSource
quelle
Detaillierte Lösung mit Screenshots
MyCustomCell.xib
.UITableViewCell
als Stammverzeichnis Ihrer xib-Datei und aller anderen gewünschten visuellen Komponenten hinzu.MyCustomCell
als Unterklasse vonUITableViewCell
.ctrl+drag
erstellen Sie Ausgänge für Ihre visuellen Komponenten.UIViewController
, um Ihre benutzerdefinierte Zelle zu verwenden.quelle
MyHeaderView.swift
für benutzerdefinierte Zelle kopiert . Die.swift
Ansicht für Kopf muss nichtidentifier
inTable View Cell
in derAttribute Inspector
. also ... Laufzeitfehler aufgetreten..swift
und in deklarierttableView?.register(blahblah, forCellReuseIdentifier: "myCell")
? Ich dachte, einer von ihnen ist nicht notwendig, aber ... ich fand, dass beide wesentlich sind..xib
für benutzerdefinierte Zellen mehrere enthalten kann,UITableViewCell
also ...xib
nicht ausreicht, um .. die richtige Zelle zu finden.Sie haben Ihre Feder nicht wie folgt registriert:
quelle
Eine andere Methode, die für Sie funktionieren kann (so mache ich das), ist das Registrieren einer Klasse.
Angenommen, Sie erstellen eine benutzerdefinierte Tabellenansicht wie folgt:
Sie können diese Zelle dann in dem UITableViewController registrieren, in dem Sie sie mit "registerClass" anzeigen möchten:
Und Sie können es so aufrufen, wie Sie es in der Zelle für die Zeilenmethode erwarten würden:
quelle
Zur Behebung des Fehlers "Überschreibende Methode ... hat inkompatiblen Typ ..." habe ich die Funktionsdeklaration in geändert
(war
-> UITableViewCell!
- mit Ausrufezeichen am Ende)quelle
schnell 4.1.2
xib.
Erstellen Sie ImageCell2.swift
Schritt 1
Schritt 2 . Entsprechend der Viewcontroller-Klasse
quelle
Ich musste beim Erstellen der Steckdose sicherstellen, dass ich mich an die Zelle und nicht an den Eigentümer des Objekts anschloss. Wenn das Menü angezeigt wird, müssen Sie es im Dropdown-Menü "Objekt" auswählen. Natürlich müssen Sie die Zelle auch als Ihre Klasse deklarieren, nicht nur 'TableViewCellClass'. Andernfalls würde ich die Klasse weiterhin nicht schlüsselkonform machen.
quelle
Nehmen Sie einfach eine xib mit der Klasse UITableViewCell . Stellen Sie die Benutzeroberfläche gemäß den Anforderungen ein und weisen Sie das IBOutlet zu. Verwenden Sie es in cellForRowAt () der Tabellenansicht wie folgt:
100% ohne Probleme arbeiten (getestet)
quelle