In meiner App verwende ich Storyboard. Aber ich habe UITableView
programmgesteuert erstellt, anstatt aus der Objektbibliothek zu ziehen. Und jetzt möchte ich die Zellen des programmgesteuert erstellten UITableView
anpassen. Kann mir jemand helfen, indem ich ein Beispiel für die programmatische Erstellung eines UITableViewCell
im Storyboard zur Verfügung stelle?benutzerdefinierte TabelleviewCells für UITableView programmatisch in Storyboard erstellt
Antwort
Ich werde zwei Optionen beschreiben: die Zelle Hinzufügen von mit Interface Builder (einfacher), und das Hinzufügen der Zelle programmatisch:
Durch die Verwendung von Interface Builder
Sobald Sie die Zelle in-Schnittstelle erstellt haben Builder und hinzugefügte Unteransichten mit Ihrem benutzerdefinierten Inhalt, öffnen Sie den Inspektor Attribute, wählen Sie die Benutzerdefiniert Stil und geben Sie eine eindeutige Kennung in die Reuse-Kennung Textfeld (zum Beispiel "anIdentifier"). Wählen Sie als nächstes die Zellenfelder aus, auf die Sie programmgesteuert zugreifen möchten, und legen Sie für jedes Element eine eindeutige -Nummer fest (unter der Ansicht Abschnitt).
Dann in der Datenquelle Code, implementieren diese Methode:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier"];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1]; // Set a constant for this so your fellow developers understand this number
label.text = @"This is a test";
return cell;
}
Programmatically
Wenn Sie die Zelle programmatisch erstellt werden soll, dann sollte der Code etwas Ähnliches wie dieses:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"anIdentifier";
UILabel *aLabel;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]];
aLabel = [[[UILabel alloc] initWithFrame:...]];
aLabel.tag = 1; // Set a constant for this
aLabel.font = [UIFont systemFontOfSize:14.0];
aLabel.textAlignment = UITextAlignmentRight;
aLabel.textColor = [UIColor blackColor];
aLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:mainLabel];
} else {
aLabel = (UILabel *)[cell.contentView viewWithTag:1];
}
aLabel.text = @"This is a test";
return cell;
}
Weitere Informationen finden Sie auf der Apple-Website: http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html
Ich würde vermeiden, Layout und Aufbau Ihrer Zelle in cellForRowAtIndexPath
setzen.
Um eine benutzerdefinierte Zelle programmatisch zu erstellen, sollten Sie zuerst eine UITableViewCell
Unterklasse erstellen.
Fügen Sie die labels
, imageViews
, etc ... Fügen Sie die als subViews der cell.contentView
.
Programatically
dh
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 21)];
[self.contentView addSubview:_label];
}
return self;
}
Wenn Sie das Layout Material der Zelle dann in der MyCell
Klasse tun möchten Sie tun können ...
- (void)layoutSubViews
{
[super layoutSubviews];
// layout stuff relative to the size of the cell.
}
dann in der tableViewController
müssen Sie die Zellklasse ...
In viewDidLoad
...
[self.tableView registerClass:[MyCell class] forCellReuseIdentifier:@"MyCellIdentifier"];
MIT INTERFACE BUILDER
noch der benutzerdefinierten Unterklasse erstellen, sondern auch eine xib Datei mit dem gleichen Namen erstellen.Dann können Sie in Ihrer XIB-Datei die Steckdosen anschließen, anstatt sie in der Initialisierung der Zelle zu erstellen. (Wenn du es so machst, wird die Init sowieso nicht aufgerufen).
Die einzige andere Änderung, die Sie brauchen, ist, dass in viewDidLoad
Sie die Feder für die Zelle nicht die Klasse registrieren müssen.
So ...
UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"MyCellIdentifier"];
Dann funktioniert alles andere gleich.
ZELLEN weiter verwenden
Um die Zelle zu verwenden, die Sie die Unterklasse für ...
es auf diese Weise tun bedeutet
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];
[self configureCustomCell:(MyCell*)cell atIndexPath:indexPath];
return cell;
}
- (void)configureCustomCell:(MyCell*)cell atIndexPath:(NSIndexPath *)indexPath
{
// do all you logic of getting any info from arrays etc in here.
cell.label.text = @"Blah".
}
Zusammenfassung erstellt haben, dass Ihr Tableviewcontroller ist nur daran interessiert, Sachen in die Zellen zu stecken. Wenn Sie all Ihre Logik für den Aufbau Ihrer Zellen verwenden, wird auch alles sehr unordentlich.
Es bedeutet auch, dass Sie nicht mit vielen verschiedenen Tags umgehen müssen, um verschiedene UI-Elemente zu speichern und abzurufen.
- 1. Storyboard: Custom UITableView
- 2. Programmatisch Storyboard-Ansicht anzeigen
- 3. Xamarin.iOS UITableView programmatisch Trennlinien ausblenden
- 4. UITableView zum Detail UITableView Drilldown mit Storyboard
- 5. ändern Pfeilfarbe für popover von Storyboard in Swift erstellt
- 6. UITableView-Zelle programmatisch markieren
- 7. iOS: Tab programmatisch ändern - Storyboard
- 8. Benutzerdefinierte Tabellenansicht Zelle in Swift, ohne Storyboard
- 9. Benutzerdefinierte Ansicht für Bildlauf in UITableView
- 10. Wie wird Xml für das Storyboard erstellt?
- 11. Xcode 6 Storyboard Warnungen erstellt
- 12. Zwei benutzerdefinierte TableViewCells in UITableView
- 13. UITableView Benutzerdefinierte Bildlaufleiste
- 14. UITableView SectionIndexTitle Benutzerdefinierte Ansicht
- 15. XCode Storyboard: Wie man ein Segment erstellt, wenn der Segment-Trigger nicht auf dem Storyboard ist
- 16. PresentModalViewController im Storyboard programmatisch iOS 5
- 17. Storyboard-Segment wird aufgerufen, bevor UITableView didSelectRow
- 18. Benutzerdefinierte UITableView-Zelle verursacht einen Fehler
- 19. Programmatisch UIView am Ende von UITableView hinzufügen
- 20. Ändern benutzerdefinierte Usercontrol programmatisch
- 21. Benutzerdefinierte Schaltfläche in einer Zeile in UITableView?
- 22. Laden Sie benutzerdefinierte SubViews programmatisch wie wenn sie Zellen wären?
- 23. Wie in Storyboard
- 24. Benutzerdefinierte UITableView Abschnitt Kopfzeilenansichten brechen
- 25. Verwenden Sie verschiedene benutzerdefinierte Zelle für jeden Abschnitt in UITableView
- 26. iOS - Storyboard - Verwenden Sie eine programmatisch Farbe in der Palette der Konfiguration definieren Storyboard
- 27. UICollectionView Breite programmatisch im Konflikt mit Storyboard-Initialisierung
- 28. Wie erstellt man ein Widget heute programmatisch ohne Storyboard auf iOS8?
- 29. UITableView Benutzerdefinierte Abschnittsüberschrift, doppeltes Problem
- 30. Wie benutzerdefinierte Tastatur schweben programmatisch in Android
UITextAlignment ... ist veraltet. Sie sollten stattdessen NSTextAlignment ... verwenden. Wow, ich lese gerade diese Apple Docs. Sagen sie dir wirklich, ALLES an einen Ort zu bringen !? Es macht die Dinge so viel unordentlicher und komplizierter. Was, wenn Sie dieselbe Zelle an einem anderen Ort verwenden möchten? Du kopierst den ganzen Code? LOL! – Fogmeister
Ab iOS 6 'dequeueReusableCellWithIdentifier:' wird 'nil' nicht mehr zurückgeben. Sie erhalten automatisch eine neue oder wiederverwendete Zelle. Wenn dies Ihr minimales Bereitstellungsziel ist, können Sie das 'if' /' else'-Konstrukt verlassen. –
Daniel, das ist nur der Fall, wenn du eine Klasse (oder eine Nib) für die Wiederverwendungs-ID gemäß meiner Antwort registriert hast. Wenn Sie keine Klasse registriert haben, wird eine Nullzelle zurückgegeben. – Fogmeister