Вопрос по uitableview, static, objective-c, cells – Установка статических ячеек в uitableview программно

6

Я программно создаю табличное представление в цели c. Как я могу сделать клетки статическими программно?

Спасибо

Ваш Ответ

5   ответов
1

Если вы хотите создать структуру ячеек, например, для экрана настроек или чего-то в этом роде, и вам, возможно, нужно просто изменить содержимое некоторых ячеек, но не их структуру числа или разделов, вы можете перегрузить метод вашего подкласса 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 настройте ячейки ячейки конфигурации:

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

Довольно часто требуется создать простую таблицу для использования в качестве меню или формы, но использование встроенного API с обратными вызовами источника данных и делегатов не облегчает написание или сопровождение. Может потребоваться динамическое добавление / удаление / обновление некоторых ячеек, поэтому использование раскадровок само по себе не работает.

Я собралMEDeclarativeTable программно строить небольшие таблицы. Он предоставляет источник данных и делегат дляUITableView, В итоге мы получаем API, в котором мы предоставляем экземпляры разделов и строк вместо реализации методов источника данных и делегирования.

9

Используя отдельный идентификатор ячейки для каждого, вы получите его. Вы можете использовать что-то вроде этого:

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

Делать ячейки статичными программно не имеет смысла. Статические ячейки в основном предназначены только для Interface Builder и требуют, чтобы весь TableView был статическим. Они позволяют перетаскивать UILables, UITextFields, UIImageViews и т. Д. Прямо в ячейки и позволяют отображать, как это выглядит в Xcode при запуске приложения.

Однако ваши ячейки могут быть «статичными» программно, без использования внешнего источника данных и жесткого кодирования всего, что обычно бывает немного грязно и, как правило, плохая идея.

Я предлагаю создать новый UITableViewController с .xib и настроить его оттуда, если вы хотите & quot; статические & quot; клетки. В противном случае просто жестко закодируйте все свои значения, и это в основном то же самое, но, вероятно, плохой дизайн, если этого можно избежать.

Я думаю, что вполне приемлемо программно создавать столько статических ячеек табличного представления, сколько вы хотите, если хотите избежать использования InterfaceBuilder. Есть много веских причин для того, чтобы минимизировать использование InterfacerBuilder.
3

Вы также можете сделать это по старинке и просто создать ячейку так, как вы хотите, в зависимости от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;
}

Похожие вопросы