7

我正在以编程方式在目标 c 中创建一个表格视图。如何以编程方式使单元格静态?

谢谢

4

5 回答 5

15

以编程方式使单元格静态并没有真正的意义。静态单元格基本上只适用于 Interface Builder,并且要求整个 TableView 是静态的。它们允许您将 UILables、UITextFields、UIImageViews 等直接拖到单元格中,并让它在应用程序运行时显示它在 Xcode 中的外观。

但是,通过不使用外部数据源并对所有内容进行硬编码,您的单元格可以通过编程方式“静态”,这通常会有点混乱,而且通常是一个糟糕的主意。

我建议使用 .xib 制作一个新的 UITableViewController 并从那里自定义它,如果你想要“静态”单元格。否则,只需对所有值进行硬编码,它基本上是一样的,但如果可以避免的话,可能是糟糕的设计。

于 2012-06-25T16:02:42.927 回答
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;
}
于 2012-06-25T16:01:10.353 回答
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;
}
于 2012-06-25T16:10:25.497 回答
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)在情节提要或 xib 中修改 TableviewController 子类的静态单元格,并为要以编程方式修改的每个单元格添加唯一的 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);
    }
}
于 2015-05-08T15:09:23.050 回答
0

想要构建一个简单的表来用作菜单或表单是很常见的,但是使用带有数据源和委托回调的内置 API 并不容易编写或维护。您可能需要动态添加/删除/更新某些单元格,因此单独使用 Storyboards 是行不通的。

我将MEDeclarativeTable放在一起以编程方式构建小表。它为UITableView. 我们最终得到一个 API,我们提供部分和行的实例,而不是实现数据源和委托方法。

于 2015-05-12T23:04:25.920 回答