Sto creando una vista tabella nell'obiettivo c. Come posso rendere statiche le celle a livello di programmazione?Impostazione di celle statiche in uitableview a livello di codice
Grazie
Sto creando una vista tabella nell'obiettivo c. Come posso rendere statiche le celle a livello di programmazione?Impostazione di celle statiche in uitableview a livello di codice
Grazie
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;
}
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.
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;
}
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);
}
}
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.