如何为每个UITableViewCell创建不同的设置

时间:2013-05-19 20:02:48

标签: objective-c uitableview

我有一个包含多个部分的tableview。

我想让其中一些可以选择,而其他则不可选。此外,可选择的单元格应链接到不同的ViewControllers。

有人知道怎么做吗?

3 个答案:

答案 0 :(得分:1)

我发现管理每个单元格信息的最好方法是创建一个cell-info类,并让它代表数据。在这个类中,您可以标记单元格是可选择的,类型,处理程序等。

然后,在将单元格出列后,根据单元格信息支持对象准备显示。


示例:

@interface MyCellInfo

@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* detail;
@property (nonatomic, strong) UIImage* image;
@property (nonatomic, getter=isSelectable) BOOL selectable;
@property (nonatomic) SEL handlingSelector;
...

@end

@implementation MyCellInfo @end

这定义了一个示例cell-info类,它包含每个单元格的一些属性。 为了便于使用,我们将在表中注册一个单元格类,以获取viewDidLoad中的示例标识符:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: @"ExampleIdentifier"];

您的表格视图数据源:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return dataSource.count;
}

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [dataSource[section] count];
}

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ExampleIdentifier"];

    MyCellInfo* cellInfo = dataSource[indexPath.section];

    if(cellInfo.image == nil)
    {
        //Show image
    }
    else
    {
        [cell.textLabel setText:cellInfo.title];
        [cell.detailTextLabel setText:cellInfo.detail];
    }

    return cell;
}

您的表格视图委托:

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
    MyCellInfo* cellInfo = dataSource[indexPath.section];

    return cellInfo.height;
}

- (BOOL)tableView:(UITableView*)tableView shouldHighlightRowAtIndexPath:(NSIndexPath*)indexPath
{
    MyCellInfo* cellInfo = dataSource[indexPath.section];

    return cellInfo.selectable;
}

- (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
    MyCellInfo* cellInfo = dataSource[indexPath.section];

    return cellInfo.selectable ? indexPath : nil;
}

- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
    MyCellInfo* cellInfo = dataSource[indexPath.section];

    [self performSelector:cellInfo.handlingSelector withObject:cellInfo];
}

剩下的就是创建数据并用MyCellInfo对象表示每个条目。我使用了数组db类型的数组,其中顶级数组表示节,而每个内部数组是节的单元格,每个单元都是MyCellInfo对象。

答案 1 :(得分:0)

答案 2 :(得分:0)

在我的另一个问题中,有人给出了一个也适用于此的答案。

cellForRowAtIndexpath中,你可以设置if语句来单独访问每个部分中的每个单元格:

if (indexPath.section == 0) {
        if (indexPath.row == 0) {
            //do any cell setup
        }
        if (indexPath.row == 1) {
            //do any cell setup
        }
   }
if (indexPath.section == 1) {
            if (indexPath.row == 0) {
                //do any cell setup
            }
            if (indexPath.row == 1) {
                //do any cell setup
            }
       }

等等。这允许你用任何东西填充cel,但也可以为每个单独的单元格进行所有设置。

同样适用于(例如)heightForRowAtIndexPath:您只需按上述方式插入if语句,并且可以设置任何单个单元格的高度。

通常情况下,如果你需要为一堆单元格设置相同的东西,你可以使用数组,并用它填充tableview,但如果你真的需要特定单元格的特定设置,这是最简单的和最好的方式(在我看来)

希望这能帮到你们所有人!