带有自定义单元格的 UITableView 在 iOS 6 上画得很好,但在 iOS 7 上完全是白色的

Posted

技术标签:

【中文标题】带有自定义单元格的 UITableView 在 iOS 6 上画得很好,但在 iOS 7 上完全是白色的【英文标题】:UITableView with custom cells draws fine on iOS 6 but completely white in iOS 7 【发布时间】:2013-11-21 21:16:23 【问题描述】:

我正在 Xcode 5 上构建一个面向 ios 6+ 的应用程序。

我无法使用自定义单元格构建表格视图。有趣的是,在我今天更新到 Xcode 5.0.2 之前它运行良好(我不知道发生了什么变化)。当我弄乱了 iOS 7 SDK 附带的白色导航栏样式(我也不知道它们如何相互链接)时,我的表格视图也确实绘制了纯白色(下面的屏幕截图)。无论如何,当我从代码中删除灯光状态栏选项时,我的表格视图过去可以正常绘制,尽管我有黑色状态栏。今天,在安装 Xcode 5.0.2 之后,我在不更改任何代码的情况下构建了相同的项目,并且我的表格视图现在在 iOS 7(设备和模拟器)上绘制为纯白色。当我切换到 iOS 6 时,它显示完美(设备和模拟器)。我试过清理构建文件夹,清理派生数据文件夹,重新启动 Xcode/simulator/device,但没有任何改变。此外,该应用程序开始显示白色状态栏,这在更新 Xcode 之前没有。我知道它们应该无关紧要,但我现在很难开发我的应用程序。单元格接收所有触摸事件,表格视图确实滚动,我在输出中得到所有NSLogs,向下滚动时我可以看到滚动条。它只是不画画。我的自定义单元格中有自定义 drawRect: 代码。在看到 UITableViewCell custom CG drawing iOS 7 和 subclassed UITableViewCell - backgroundView covers up anything I do in drawRect 之后,我注释掉了该代码,但它没有帮助。这是我在 iOS 7 上得到的结果(选定的单元格为灰色):

这是 iOS 6 上的同一个应用程序(模糊的文本/图像以保护隐私):

这是-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath的代码:

MyFriendViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"friendTableCell"];
    if(!cell)
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyFriendViewCell" owner:self options:nil] lastObject];
    
    /* some code that sets text fields/images */
    [...]
    return cell;

我有一个 XIB 文件(只有一个对象,我的自定义单元格类)和一个对应于该单元格的类。我一开始就注册了我的手机:

[self.tableView registerNib:[UINib nibWithNibName:@"MyFriendViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"friendTableCell"];

我已经检查了方法中的cell,无论如何,出队永远不会返回nil

更新:我还意识到,我的应用在 iOS 6(即使它运行正确)和 iOS 7 上的此屏幕上空闲时使用 100% CPU。

重要提示:问题已得到解答,但对于任何想知道drawRect: 的人来说,问题与此无关,我仍在使用自定义drawRect: 和效果很好。

【问题讨论】:

可以分享cellForRowAtIndexPath方法的代码吗? @Ilario 我已经编辑了我的问题。 请注意,dequeueResusableCellWithIdentifier 现在将始终返回构造的单元格。如果一个不存在,它会为您创建它。不再需要 if(!cell) 语句。 旧习惯 :) 我会改掉的,谢谢。 【参考方案1】:

setcontentviewbackgroundColor清除颜色

【讨论】:

已经是clearColor了,我之前也遇到过这个问题。三个init方法都设置为self.contentView.backgroundColor = [UIColor clearColor];,经过调试验证绘制时还是清晰的颜色。 检查 contentView cell.background, backgroundview 是的,它是 cell.backgroundColor。我已将初始化代码更改为`self.contentView.backgroundColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor];` 它奏效了。从 5.0.0 更新到 xcode 5.0.2 后,为什么会发生这种奇怪的变化? 我认为 iOS7 改变了单元格默认视图的构建方式 当我还在 iOS 7 中时,在 xcode 5.0.0 中没有发生同样的事情仍然很有趣。【参考方案2】:

@Kjuly 的This answer 对类似问题的回答是我用来解决此问题的方法。重要的部分是将此方法添加到您的表格视图的委托中:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath

  [cell setBackgroundColor:[UIColor clearColor]];

【讨论】:

以上是关于带有自定义单元格的 UITableView 在 iOS 6 上画得很好,但在 iOS 7 上完全是白色的的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义单元格的 ViewController 内的 UITableView 没有情节提要

带有包含自定义单元格的 UITableView 的 UISearchBar => 空白单元格

带有自定义单元格的 UITableView 弹出窗口失败,单元格属性始终为零

iOS - 带有自定义单元格的可点击 UITableView

带有Swift的多个自定义单元格的UITableview

在 Actionsheet 上选择的 NSDictionary,来自带有自定义单元格的 UITableView