当我实现heightForRowAtIndexPath时,UITableView Cells在彼此之上绘制

时间:2016-01-10 22:47:12

标签: ios objective-c uitableview

我正在制作一个使用UITableView的新iOS项目。当我实现heightForRowAtIndexPath时,所有单元格都会相互重叠,如屏幕截图所示。

Surefire Fork Options

如果我没有实现heightForRowAtIndexPath例程,则单元格正常绘制(即使它们的高度不正确)。实现heightForRowAtIndexPath会触发overdraw行为。

我之前已经多次实现过表格和单元格而没有看到这个问题。与我之前的项目相比,这个项目中的两件新事物是:

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

  2. 此项目已启用尺寸等级,之前我总是只使用iPhone或iPad目标项目。

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

        -(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;
    }
    

    有人有什么想法吗?

    编辑:下面有人提到这不是给出的代码的屏幕截图,而且这是真的。我将附上那个屏幕截图 - 这张截图是在模拟器中拍摄的,我把桌子拉了下来,这条线位于桌子的最顶端。用这种方式分配的细胞很难找到它。有人提到它看起来像是高度为0,我相信这是真的。我只是不知道它是如何从44变为0,我不知道如何检查它。当我分配它时,单元格的边界/高度为44(我知道通过我输入的一些调试代码)。

    我还编辑了代码,注意我根据建议调用了initWithStyle - 这没有效果。

    cells on top of each other

1 个答案:

答案 0 :(得分:3)

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

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

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