多个不同尺寸的定制单元

时间:2015-07-07 10:24:36

标签: ios objective-c uitableview uiview

我一直在做很多研究,但找不到答案或帮助指南。 我想在表格视图中有多个自定义单元格。例如,第一个单元格可以显示图像,而第二个单元格显示一些信息,然后第三个单元格显示其他内容(所有单元格大小不同)。我已经尝试了很多代码,但无法正确使用,我也一直在观看教程,但仍然无法做到这一点。在没有单元格的空白UIView中执行此操作会更容易吗? 非常感谢谢谢,帮助和建议。

3 个答案:

答案 0 :(得分:1)

我们假设您有一个包含一个部分的表视图。以下是我通常如何做到这一点:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    id cell = nil;
    switch (indexPath.row) {
        case 0:
            cell = [self dequeCellIdentifier:@"FirstTypeOfCell"];
            break;

        case 1:
            cell = [self dequeCellIdentifier:@"SecondTypeOfCell"];
            break;

        case 2:
            cell = [self dequeCellIdentifier:@"ThirdTypeOfCell"];
            break;

        default:
            cell = [self dequeCellIdentifier:@"JustThrowThisInThere"];
            break;
    }
    return cell; 
}

要使单元格出列,请确保在XIB界面中指定其标识符并将此方法添加到出列:

- (id)dequeCellIdentifier:(NSString *)cellIdentifier {
    id cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil][0];
    }
    return cell; 
}

要获得不同的单元格高度,请使用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        switch (indexPath.row) {
        case 0:
            return 40.0;

        case 1:
            return 100.0;

        default:
            return 50.0;
    }
}

答案 1 :(得分:0)

为从UITableViewCell继承的每个单元格创建自定义类。确保在创建类时也创建了一个XIB。这使您可以灵活地在界面构建器中设计单元格。

查看此答案:How do you load custom UITableViewCells from Xib files?

PS。别忘了改变

中细胞的高度
- (CGFloat)tableView:(UITableView *)tableView 
                                heightForRowAtIndexPath:(NSIndexPath *)indexPath

答案 2 :(得分:0)

您可以在故事板中使用原型单元格。基本上你要做的是为每种类型创建一个原型单元格,并为每个类型创建一个UITableViewCell子类。还给每个人一个唯一的ID。所有这些步骤都会详细解释here(跟随Modifying the CarTableViewCell Class部分)。

现在是棘手的部分。上面的教程仅介绍了如何创建一个自定义单元格。如果您需要多种类型的自定义单元格,请创建具有唯一reuse identifiersubclasses的所有单元格。现在我不确定这是否是正确的方法,但这是我通常做的事情:

CellForRowAtIndexPath中的

if([cellType isEqualToString:@"DefaultCell"])
{
    MyTableDefaultCell *cell = [self.tableViewOutlet dequeueReusableCellWithIdentifier:@"DefaultCell" forIndexPath:indexPath];

    if(cell == nil)
    {
        cell = [[MyTableDefaultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DefaultCell"];
    }

    //Do your thing here.

    return cell;
}


else if([cellType isEqualToString:@"SegmentedControlCell"])
{

    MyTableSegmentControlCell *cell = [self.tableViewOutlet dequeueReusableCellWithIdentifier:@"SegmentedControlCell" forIndexPath:indexPath];

    if(cell == nil)
    {
        cell = [[MyTableSegmentControlCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SegmentedControlCell"];
    }

     // Setup cell here.

    return cell;
}

并且不要忘记在heightForRowAtIndexPath:中为每个单元格返回适当的高度。欢呼声。