Установка статических ячеек в uitableview программно
Я программно создаю tableview в objective c. Как сделать ячейки статическими программно?
спасибо
5 ответов
используя отдельный идентификатор ячейки для каждого из них, вы получите его. Вы можете использовать что-то вроде этого:
- (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;
}
создание статических ячеек программно не имеет смысла. Статические ячейки в основном предназначены только для построителя интерфейса и требуют, чтобы весь TableView был статическим. Они позволяют перетаскивать UILables, UITextFields, UIImageViews и т. д. прямо в ячейки и показать, как это выглядит в Xcode при запуске приложения.
однако ваши ячейки могут быть" статическими " программно, не используя внешний источник данных и все жесткое кодирование, которое обычно будет грязная и вообще плохая идея.
Я предлагаю сделать новый UITableViewController с a .xib и настройка его оттуда, если вы хотите "статические" ячейки. В противном случае просто hardcode все ваши ценности, и это в основном то же самое, но, вероятно, плохой дизайн, если его можно избежать.
вы также можете сделать это по старинке и просто создать ячейку так, как вы хотите в зависимости от NSIndexPath
, это работает со статическими ячейками TVC и обычными представлениями таблиц (не забудьте вернуть правильное количество разделов и строк в своих методах источника данных):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch indexPath.row {
case 0:
// First cell, setup the way you want
case 1:
// Second cell, setup the way you want
}
// return the customized cell
return cell;
}
Я вы хотите создать структуру ячеек, например, для экрана настроек или что-то в этом роде, и вам, возможно, нужно просто изменить содержимое некоторых ячеек, но не их количество или структуру разделов вы можете перегрузить метод вашего подкласса UITableViewController следующим образом:
- (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;
}
но вы можете сделать это лучше с немного большим количеством кода;
1) в начале ваш .M Файл Добавить typedef:
typedef void(^IDPCellConfigurationBlock)(UITableViewCell *aCell);
2) добавить свойство cellConfigurations в расширение TablviewControllerSubclass:
@interface IPDSettingsTableViewController ()
@property (nonatomic, strong) NSDictionary *cellConfigurations;
@property (nonatomic) id dataModel;
@end
3) Измените статические ячейки подкласса TableviewController в раскадровке или xib и добавьте уникальный cellReuseIdentifier для каждой ячейки, которую вы хотите изменить программно
4) в ваших блоках настройки метода viewDidLoad 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) перегрузка tableView: cellforrowatindexpath метод, как это:
#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);
}
}
довольно часто требуется создать простую таблицу для использования в качестве меню или формы, но использование встроенного API с источником данных и обратными вызовами делегатов не упрощает запись или обслуживание. Возможно, вам придется динамически добавлять/удалять / обновлять некоторые ячейки, поэтому использование раскадровок само по себе не будет работать.
Я собрал MEDeclarativeTable для программного построения небольших таблиц. Он предоставляет источник данных и делегат для UITableView
. Мы заканчиваем с API, где мы предоставьте экземпляры разделов и строк вместо реализации методов datasource и delegate.