XCode 6问题 - dequeueReusableCellWithIdentifier未返回自定义单元格高度

时间:2014-09-23 13:07:00

标签: ios objective-c uitableview heightforrowatindexpath

我有一个UITableViewController,其中包含2个具有自定义高度的原型单元格 - 一个高度为187点,另一个高度为140点。 tableview的默认行高是ser到187。

我的cellForRowAtIndexPath如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (indexPath.section == 0) {
        MyListingCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyListingCell"];
        [cell initWithListing:[self.listings objectAtIndex:indexPath.row]];
        return cell;
    } else {
        return [tableView dequeueReusableCellWithIdentifier:@"AddMyListingCell"];
    }
}

我有一个匹配的heightForRowAtIndexPath,如下所示:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (indexPath.section == 0) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyListingCell"];
        return cell.frame.size.height;
    } else {

        //if no listings exist, make the cell full-screen height
        if (self.listings.count == 0) {   
            return tableView.frame.size.height;
        } else {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AddMyListingCell"];
            return cell.frame.size.height;
        }
    }
}

当我运行代码时,单元格高度正确显示。分别为187和140。

但是,我想将较大单元格的大小更改为213分。为此,我将自定义tablecell高度更改为213.问题是当我运行代码(使用XCode 6)时,表格单元格仍然以高度187出现。

我尝试将默认的tableview rowheight属性更改为213.但是我仍然得到187.事实上,当我查看故事板(作为文本)时,在任何地方都没有提到187。但似乎XCode正在记住以前的值。

我尝试过清洁,深度清洁,重新启动xcode,从手机中删除应用以及删除我的调试产品。我无法忘记187。

这可能是XCode 6中的错误吗?在XCode 5中,这不会发生(证明)。自定义单元格高度在XCode 5中运行良好,但是在安装XCode 6后的第二天出现了这个问题。

任何人都可以提供一些有关尝试的建议,或者确认我不会发疯。

1 个答案:

答案 0 :(得分:1)

heightForRowAtIndexPathcellForRowAtIndexPath之前调用,因此您永远不能使用它来尝试引用单元格并获得高度。使用以下日志行和结果查看以下代码:

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

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"HEIGHT");
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    NSLog(@"%@", cell);
    return cell.frame.size.height;
}

结果是:

2014-09-23 09:55:05.114 NewTesting[54040:60b] HEIGHT
2014-09-23 09:55:05.114 NewTesting[54040:60b] (null)
2014-09-23 09:55:05.115 NewTesting[54040:60b] HEIGHT
2014-09-23 09:55:05.115 NewTesting[54040:60b] (null)
2014-09-23 09:55:05.115 NewTesting[54040:60b] HEIGHT
2014-09-23 09:55:05.116 NewTesting[54040:60b] (null)
2014-09-23 09:55:05.116 NewTesting[54040:60b] HEIGHT
2014-09-23 09:55:05.116 NewTesting[54040:60b] (null)
2014-09-23 09:55:05.117 NewTesting[54040:60b] CELL
2014-09-23 09:55:05.118 NewTesting[54040:60b] CELL
2014-09-23 09:55:05.119 NewTesting[54040:60b] CELL
2014-09-23 09:55:05.120 NewTesting[54040:60b] CELL

考虑到这一点,你使用的方法永远不会有用。

你有没有尝试过更简单的东西,比如下面的内容(虽然我个人会使用常量)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return indexPath.section == 0 ? 213 : 140;
}

假设第一部分中的所有单元格都是213高,而任何其他部分140高,这可能是不正确的。

最终,我认为做你想做的最好的方法是基本上询问你的数据源在给定indexPath时应该存在哪种类型的单元格,因此单元格应该有多高。“ p>