2012-06-25 21 views

risposta

9

utilizzando un identificatore di cella distinta per ognuno lo otterrete. È possibile utilizzare qualcosa di simile:

- (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

Rendere statiche le celle al livello di programmazione in realtà non ha senso. Le celle statiche sono fondamentalmente solo per Interface Builder e richiede che l'intero TableView sia statico. Ti consentono di trascinare UILables, UITextFields, UIImageViews, ecc. Direttamente nelle celle e visualizzarlo come appare in Xcode quando viene eseguita l'app.

Tuttavia, le tue celle possono essere "statiche" a livello di codice non utilizzando un'origine dati esterna e tutto il codice di protezione, che di solito sarà un po 'disordinato e generalmente una cattiva idea.

Suggerisco di creare un nuovo UITableViewController con un file .xib e di personalizzarlo da lì se si desidera celle "statiche". Altrimenti, basta codificare tutti i valori ed è fondamentalmente la stessa cosa, ma è probabilmente un design scadente se può essere evitato.

3

Si potrebbe anche fare il vecchio stile e basta creare la cella nel modo desiderato a seconda del NSIndexPath, questo funziona con le TVC di Statico Cella e le tabelle regolari (non dimenticare di restituire il numero corretto di sezioni e righe nei loro metodi di origine dati):

- (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

mi si vuole creare la struttura delle cellule, ad esempio per una schermata delle impostazioni o qualcosa del genere e forse ha bisogno solo di modificare alcune cellule contenuto, ma non il loro numero o sezioni struttura si possono sovraccaricare metodo della sottoclasse UITableViewController come questo:

- (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; 
} 

Ma puoi farlo in un modo migliore con un po 'più di codice;

1) In principio del file .m aggiungere typedef:

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

2) aggiungere proprietà cellConfigurations alla vostra estensione TablviewControllerSubclass:

@interface IPDSettingsTableViewController() 

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

@end 

3) Modificare le cellule statiche di TableviewController sottoclasse nello storyboard o nello xib e aggiungi un unico cellReuseIdentifier per ogni cella che desideri modificare a livello di codice

4) Nei tuoi viewDidLoad di impostazione metodo blocchi cellsConfiguration:

- (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) Sovraccarico tableView: metodo cellForRowAtIndexPath come questo:

#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

E 'abbastanza comune il desiderio di costruire una tabella semplice da usare come un menu o modulo, ma l'utilizzo dell'API incorporata con l'origine dati e le chiamate delegate non rendono facile la scrittura o la manutenzione. Potrebbe essere necessario aggiungere/rimuovere/aggiornare dinamicamente alcune celle, quindi l'utilizzo di Storyboard da solo non funzionerà.

Ho assemblato MEDeclarativeTable per creare tabelle di dimensioni ridotte.Fornisce l'origine dati e il delegato per UITableView. Finiamo con un'API in cui forniamo istanze di sezioni e righe anziché implementare i metodi dell'origine dati e dei delegati.

Problemi correlati