2012-06-25 16 views

Antwort

9

Durch eine eindeutige Zellenkennung für jeden verwenden Sie es bekommen. Sie könnten etwas wie folgt verwenden:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = [NSString stringWithFormat:@"s%i-r%i", indexPath.section, indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 
     //you can customize your cell here because it will be used just for one row. 
    } 

    return cell; 
} 
12

Zellen statisch programmgesteuert machen macht eigentlich keinen Sinn. Statische Zellen sind im Grunde nur für den Interface Builder vorgesehen und erfordern, dass das gesamte TableView statisch ist. Mit ihnen können Sie UILables, UITextFields, UIImageViews usw. direkt in Zellen ziehen und so anzeigen lassen, wie es in Xcode aussieht, wenn die App ausgeführt wird.

Ihre Zellen können jedoch "statisch" programmatisch sein, indem Sie keine externe Datenquelle verwenden und alles hartcodieren, was normalerweise ziemlich unordentlich und im Allgemeinen eine schlechte Idee ist.

Ich empfehle, einen neuen UITableViewController mit einer .xib und Customizing von dort, wenn Sie "statische" Zellen wollen. Ansonsten kodiere einfach all deine Werte und es ist im Grunde dasselbe, aber wahrscheinlich ein schlechtes Design, wenn es vermieden werden kann.

3

Sie könnten es auch die altmodische tun und nur die Zelle erstellen, wie Sie je nach NSIndexPath wollen, funktioniert dies mit statischen Cell TVC und regulären Tabellenansichten (Vergessen Sie nicht, die richtige Anzahl von Abschnitten und Zeilen in ihre Datenquelle Methoden):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    switch indexPath.row { 
     case 0: 
      // First cell, setup the way you want 

     case 1: 
      // First cell, setup the way you want 
    } 

    // return the customized cell 
    return cell; 
} 
1

ich möchte Sie Zellen Struktur zum Beispiel für einen Einstellungsbildschirm oder so ähnlich und Sie vielleicht brauchen nur zu ändern, einige Zellen Inhalt, nicht aber ihre Anzahl oder Abschnitte Struktur können Sie erstellen Überlastung Methode Ihrer UITableViewController-Unterklasse wie folgt:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *aCell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

    // Configure the cell... 
    if ([aCell.reuseIdentifier isEqualToString:@"someIdentifier"]){ 
     //some configuration block 
    } 

    else if ([aCell.reuseIdentifier isEqualToString:@"someOtherIdentifier"]) { 
     //other configuration block 
    } 
    return aCell; 
} 

Aber Sie können es mit ein bisschen mehr Code auf eine bessere Weise machen;

1) In dem Anfang .m-Datei hinzufügen typedef:

typedef void(^IDPCellConfigurationBlock)(UITableViewCell *aCell); 

2) cellConfigurations Eigenschaft zu Ihrer TablviewControllerSubclass Erweiterung hinzufügen:

@interface IPDSettingsTableViewController() 

@property (nonatomic, strong) NSDictionary *cellConfigurations; 
@property (nonatomic) id dataModel; 

@end 

3) ändern Sie bitte Ihre statischen Zellen von Tableviewcontroller Unterklasse in Storyboard oder Xib und fügen Sie einen eindeutigen CellReuseIdentifier für jede Zelle, die Sie programmgesteuert ändern möchten

4) In Ihrem viewDidLoad Methode Setup cellsConfiguration Blöcke:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self SetupCellsConfigurationBlocks]; 
} 

- (void)SetupCellsConfigurationBlocks 
{ 
    //Store configurations code for each cell reuse identifier 
    NSMutableDictionary *cellsConfigurationBlocks = [NSMutableDictionary new];   


    //store cells configurations for a different cells identifiers 
    cellsConfigurationBlocks[@"someCellIdentifier"] = ^(UITableViewCell *aCell){ 
     aCell.backgroundColor = [UIColor orangeColor]; 
    }; 

    cellsConfigurationBlocks[@"otherCellIdentifier"] = ^(UITableViewCell *aCell){ 
     aCell.imageView.image = [UIImage imageNamed:@"some image name"]; 
    }; 

    //use waek reference to self to avoid memory leaks 
    __weak typeof (self) weakSelf = self; 
    cellsConfigurationBlocks[@"nextCellIdentifier"] = ^(UITableViewCell *aCell){ 
     //You can even use your data model to configure cell 
     aCell.textLabel.textColor = [[weakSelf.dataModel someProperty] isEqual:@YES] ? [UIColor purpleColor] : [UIColor yellowColor]; 
     aCell.textLabel.text  = [weakSelf.dataModel someOtherProperty]; 
    }; 
    weakSelf.cellConfigurations = [cellsConfigurationBlocks copy]; 
} 

5) überlasten Tableview: cellForRowAtIndexPath Methode wie folgt:

#pragma mark - Table view data source 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *aCell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

    // configure cell 
    [self configureCell:aCell withConfigurationBlock:self.cellConfigurations[aCell.reuseIdentifier]]; 
    return aCell; 
} 

- (void)configureCell:(UITableViewCell *)aCell withConfigurationBlock:(IDPCellConfigurationBlock)configureCellBlock 
{ 
    if (configureCellBlock){ 
     configureCellBlock(aCell); 
    } 
} 
0

Es ist ziemlich üblich, eine einfache Tabelle zu verwenden, wie ein bauen zu wollen, Menü oder Formular, aber die Verwendung der integrierten API mit den Datenquellen- und Delegate-Rückrufen macht es nicht einfach zu schreiben oder zu warten. Möglicherweise müssen Sie einige Zellen dynamisch hinzufügen/entfernen/aktualisieren, sodass die Verwendung von Storyboards allein nicht funktioniert.

Ich setze MEDeclarativeTable zusammen, um programmatisch kleine Tabellen zu erstellen.Es stellt die Datenquelle und den Delegaten für UITableView bereit. Wir haben am Ende eine API, in der wir Instanzen von Abschnitten und Zeilen bereitstellen, anstatt Datenquellen- und Delegate-Methoden zu implementieren.

Verwandte Themen