Ich versuche herauszufinden, wie man das einstellt, UITableViewCellStyle
wenn man die neuen Methoden in iOS 6 verwendet UITableView
.
Früher habe UITableViewCell
ich beim Erstellen eines die UITableViewCellStyle
Aufzählung geändert , um beim Aufrufen verschiedene Arten von Standardzellen zu erstellen, initWithStyle:
aber soweit ich das beurteilen kann, ist dies nicht mehr der Fall.
Die Apple-Dokumentation für UITableView
Staaten:
Rückgabewert : Ein UITableViewCell-Objekt mit der zugehörigen Wiederverwendungskennung. Diese Methode gibt immer eine gültige Zelle zurück.
Diskussion : Aus Leistungsgründen sollte die Datenquelle einer Tabellenansicht UITableViewCell-Objekte im Allgemeinen wiederverwenden, wenn sie Zellen in ihrer tableView: cellForRowAtIndexPath: -Methode Zellen zuweist. Eine Tabellenansicht verwaltet eine Warteschlange oder Liste von UITableViewCell-Objekten, die die Datenquelle zur Wiederverwendung markiert hat. Rufen Sie diese Methode von Ihrem Datenquellenobjekt aus auf, wenn Sie aufgefordert werden, eine neue Zelle für die Tabellenansicht bereitzustellen. Diese Methode entfernt eine vorhandene Zelle aus der Warteschlange, wenn eine verfügbar ist, oder erstellt eine neue Zelle basierend auf der zuvor registrierten Klassen- oder NIB-Datei.
Wichtig : Sie müssen eine Klassen- oder NIB-Datei mit der Methode registerNib: forCellReuseIdentifier: oder registerClass: forCellReuseIdentifier: registrieren, bevor Sie diese Methode aufrufen.
Wenn Sie eine Klasse für den angegebenen Bezeichner registriert haben und eine neue Zelle erstellt werden muss, initialisiert diese Methode die Zelle durch Aufrufen ihrer Methode initWithStyle: reuseIdentifier :. Bei nib-basierten Zellen lädt diese Methode das Zellenobjekt aus der bereitgestellten nib-Datei. Wenn eine vorhandene Zelle zur Wiederverwendung verfügbar war, ruft diese Methode stattdessen die prepareForReuse-Methode der Zelle auf.
So sieht mein neues cellForRowAtIndexPath
nach der Implementierung der neuen Methoden aus:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"cell_identifier";
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
return cell;
}
Der Code, den ich bisher habe, funktioniert einwandfrei, gibt aber immer den Standardstil zurück. Wie kann ich das ändern , damit ich Zellen mit den anderen Stilen wie schaffen kann UITableViewCellStyleDefault
, UITableViewCellStyleValue1
, UITableViewCellStyleValue2
und UITableViewCellStyleSubtitle
?
Ich möchte keine Unterklasse erstellen UITableViewCell
, sondern nur den Standardtyp ändern, wie ich es vor iOS 6 tun konnte. Es scheint seltsam, dass Apple erweiterte Methoden bereitstellt, jedoch mit minimaler Dokumentation, um deren Implementierung zu unterstützen.
Hat jemand dies gemeistert oder ist er auf ein ähnliches Problem gestoßen? Ich habe Mühe, überhaupt vernünftige Informationen zu finden.
quelle
UITableViewCell
, um die anderen Standardstile zu erhalten, ist ein Problem, da nur unnötige Dateien erstellt werden. Vielen Dank für Ihren Kommentar und die Bestätigung meines Verdachts.dequeueReusableCellWithIdentifier
ist nicht veraltet, sodass Sie das neue nicht verwenden müssendequeueReusableCellWithIdentifier:forIndexPath:
.Verwenden Sie den neuen Weg zusammen mit der entsprechenden Registermethode (in viewDidLoad), wenn Sie eine benutzerdefinierte Zellenklasse verwenden, aber verwenden Sie den alten Weg, wenn Sie eine der UITableViewCellStyle-Aufzählungen verwenden möchten.
quelle
dequeueReusableCellWithIdentifier:forIndexPath:
, um einige Kennungen bereitzustellen, die Zellen auf die alte Weise erstellen (und zurückgeben). Andere Bezeichner rufen super auf und geben das zurück. Es kann sinnvoll sein,NSDictionary
Bezeichner für Konstruktorblöcke für diese Art von Bezeichnern zu haben.Sie können eine überflüssige Unterklasse vermeiden, indem Sie den Storyboard Interface Builder verwenden:
Das neue iOS 6.0
dequeueReusableCellWithIdentifier:forIndexPath:
verwendet diese Werte, wenn neue Zellen zugewiesen und zurückgegeben werden. (Getestet auf einer iOS 6.0-Kompilierung mit Xcode 4.5.2)quelle
Eine andere Alternative, die eine Datei speichert, besteht darin, eine Schreibfeder zu erstellen und
registerNib:forCellReuseIdentifier:
stattdessen zu verwenden.Das Erstellen der Feder ist einfach: Erstellen Sie eine neue .xib-Datei in Interface Builder. Löschen Sie die Standardansicht. Fügen Sie ein Zellenobjekt für die Tabellenansicht hinzu. Ändern Sie im Attributinspektor den Stil für die Zelle. (Hier haben Sie auch die Möglichkeit, die Zelle weiter anzupassen, indem Sie andere Attribute anpassen.)
viewDidLoad
Rufen Sie dann in der Methode Ihres Table View Controllers Folgendes auf:quelle
Bolots Antwort ist die richtige. Einfach und Sie müssen keine XIB-Datei erstellen.
Ich wollte nur seine Antwort für jeden aktualisieren, der es mit Swift anstelle von Objective-C macht:
quelle
Meine Lösung besteht darin, anzurufen,
initWithStyle: reuseIdentifier:
nachdem ich es mit erhalten habe[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]
. Immerhininit
ist es nur ein weiterer Selektor, und der Compiler macht keine Einschränkungen beim Aufrufen eines bereits initialisierten Objekts. Es wird sich jedoch darüber beschweren, dass das Ergebnis des Aufrufs von init nicht verwendet wird, also mache ich:Ich kann mir vorstellen, dass dies in Swift nicht funktioniert ...
quelle
initWithStyle: reuseIdentifier
das zweite Mal aufrufen , überschreiben Sie die Zelle tatsächlich mit einem neu erstellten Objekt. Ja, die Zuweisung des Speichers wurde bereits vorgenommen, und die neue Zelle wird denselben Speicherort überschreiben. Sie erstellen jedoch tatsächlich ein völlig neues Objekt, wenn Sie es erneut initialisieren. Dies negiert die gesamte Optimierung, die den Sinn der Wiederverwendung von Zellen ausmacht.