我正在制作一个使用UITableView的新iOS项目。当我实现heightForRowAtIndexPath时,所有单元格都会相互重叠,如屏幕截图所示。
如果我没有实现heightForRowAtIndexPath例程,则单元格正常绘制(即使它们的高度不正确)。实现heightForRowAtIndexPath会触发overdraw行为。
我之前已经多次实现过表格和单元格而没有看到这个问题。与我之前的项目相比,这个项目中的两件新事物是:
我从UIView模板开始,它给了我一个故事板作为根视图。展示问题的视图是非故事板视图控制器。我之前总是有一个XIB作为根。我不知道这是否或如何与此相关。
此项目已启用尺寸等级,之前我总是只使用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;
}
有人有什么想法吗?
编辑:下面有人提到这不是给出的代码的屏幕截图,而且这是真的。我将附上那个屏幕截图 - 这张截图是在模拟器中拍摄的,我把桌子拉了下来,这条线位于桌子的最顶端。用这种方式分配的细胞很难找到它。有人提到它看起来像是高度为0,我相信这是真的。我只是不知道它是如何从44变为0,我不知道如何检查它。当我分配它时,单元格的边界/高度为44(我知道通过我输入的一些调试代码)。
我还编辑了代码,注意我根据建议调用了initWithStyle - 这没有效果。
答案 0 :(得分:3)
方法-tableView:heightForRowAtIndexPath:
的正确返回类型为CGFloat
。 CGFloat
是Core Graphics和UIKit(CocoaTouch)的主要类型。 CGFloat
不是 float
。 CGFloat
是一种类型,根据处理器架构,变为float
或double
(32位或64位)。
现在只有在64位架构(CGFloat
为double
)上运行时才会出现问题。您的方法将返回一个32位浮点数(声明为返回float
),但调用者将从堆栈中读取64位(在协议中,该方法被声明为返回CGFloat
)。这种情况未定义,可能导致多种行为。在您的情况下,得到的64位数非常小(不是零,而是十进制数接近于零),因此单元格将重叠。
始终匹配函数/方法声明中的类型。