当我实现 heightForRowAtIndexPath 时,UITableView 单元格在彼此之上绘制

Ned*_*lin 1 objective-c uitableview ios

我正在制作一个使用 UITableView 的新 iOS 项目。当我实现 heightForRowAtIndexPath 时,单元格都在彼此之上绘制,如屏幕截图所示。

细胞在彼此之上

如果我不实现 heightForRowAtIndexPath 例程,单元格绘制正常(即使它们不是完全正确的高度)。实现 heightForRowAtIndexPath 会触发透支行为。

我之前已经多次实现表格和单元格,但没有看到这个问题。与我之前的项目相比,这个项目对我来说有两件新的事情:

  1. 我从 UIView 模板开始,它给了我一个故事板作为根视图。出现问题的视图是非故事板视图控制器。我以前一直有一个 XIB 作为根。我不知道这是否或如何与此相关。

  2. 这个项目启用了尺寸类,在此之前我一直只使用 iPhone 或 iPad 目标项目。

即使很无聊,我也会附上我的代码:

    -(float) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier=@"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil)
    {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
    }

    cell.textLabel.text = @"Cell title";
    return cell;
}
Run Code Online (Sandbox Code Playgroud)

谁有想法?

编辑:下面有人提到这不是给出的代码的屏幕截图,这是真的。我会附上那个屏幕截图——这个截图是在模拟器中截取的,我把桌子拉下来了一些,这条线在桌子的最顶部。以这种方式分配的单元格有点难以捕捉。其他人提到它看起来像单元格高度为 0,我相信这是真的。我只是不知道它是如何从 44 变为 0 的,也不知道如何检查它。当我分配单元格时,单元格的边界/高度是 44(我知道通过我输入的一些调试代码)。

我还编辑了代码以指出我根据建议调用了 initWithStyle - 这没有任何效果。

截图 2

Sul*_*han 5

方法的正确返回类型-tableView:heightForRowAtIndexPath:CGFloat. CGFloat是 Core Graphics 和 UIKit (CocoaTouch) 的主要类型。CGFloat 不是 floatCGFloat是一种根据处理器架构变为floatdouble(32 位或 64 位)的类型。

现在,只有在 64 位架构 ( CGFloatis double)上运行时才会出现问题。您的方法将返回一个 32 位浮点数(声明为返回float),但调用者将从堆栈中读取 64 位(在协议中该方法声明为返回CGFloat)。这种情况是未定义的,可能会导致多种行为。在您的情况下,生成的 64 位数字非常小(不是零,而是接近零的十进制数),因此单元格将重叠。

始终匹配来自函数/方法声明的类型。