Установка статических ячеек в uitableview программно

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

Спасибо

Ответы на вопрос(5)

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

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

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

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

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

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

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

Решение Вопроса

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

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

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

Ваш ответ на вопрос