如何防止UITableView在UIPopoverController(iOS7)中分隔符颜色变黑?

10
我的应用程序使用UITableViewController,它是UINavigationController的子视图控制器,并且是UIPopoverController的内容视图控制器。我正在定制UITableViewController的UITableView的外观。它可以完美地在iOS 5和6上工作,但在iOS 7上有一个问题。单元格的分隔符被设置为白色,并且表格视图最初显示了正确的分隔符颜色。然而,一旦我滚动表格视图并重新加载单元格(即调用cellForRowAtIndexPath和willDisplayCell函数),新重新加载的单元格的分隔符全部变成黑色。
我通过在UITableViewController的viewDidLoad函数中调用此函数来自定义分隔符颜色:
self.tableView.separatorColor = [UIColor whiteColor];

如果我在应用程序的其他地方使用完全相同的表视图(而不是在UIPopoverController中),那么我就没有这个问题。

据我所知,文档中没有任何内容表明iOS 7在这方面与5或6有所不同。也许这是一个iOS的bug?非常感谢任何帮助。


表视图单元格已着色,因此在白色时可见分隔符。因此,我不想将它们移除。 - user1021430
3
自从遇到这个问题以来,我还没有找到任何解决方案,看起来这确实是iOS7 UIKit的一个bug。我已经向苹果报告了这个问题,但尚未收到任何回复。 - user1021430
尝试将其设置为清除颜色。 另一种方法:将TableView的分隔符样式设置为无。 - iOS_DEV
@user1021430 在 viewDidAppear 中重新加载表格数据似乎对我有帮助。 - zambrey
@TimWindsorBrown 我这样做是因为我在某个地方读到过,重新加载表格中的行会使分隔符重新出现,而且如果我通过将UITableViewCell滚动到屏幕外来强制重新加载它,我也可以看到分隔符重新出现。 - zambrey
显示剩余6条评论
4个回答

1
这个 iOS 错误在 iOS7.0.6 中仍然存在。我有一个黑色背景和白色分隔线的表格。在第一次查看 UIPopover 时,分隔线以白色正确显示,但在同一弹出窗口的第二次及后续显示中会变成黑色。
使用 tableview 的 reloadData 没有帮助。
我找到的唯一实用的解决方法是以下内容,它会导致整个表格被重新绘制:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [_tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}

注释

1)如果只使用viewWillAppear代码,则分隔线在变黑之前会正确显示。如果只使用viewDidAppear代码,则在弹出窗口显示后,分隔线变白需要明显的延迟时间。同时使用两者可为用户提供最流畅的视觉效果。

2)如果您的表格有多个部分,则应确保重新加载所有部分,因为用户可能在弹出窗口隐藏之前已经滚动到另一个部分。

PS- 经过进一步测试,我发现即使这个解决方案也不是完美的。在重新显示后,如果您滚动表格,则最初未显示的分隔线会再次变黑。因此,它只在表格没有足够的行可以超出弹出窗口大小时才能正常工作。


1
将此设置在viewWillAppear中。
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
        self.tableView.separatorColor = [UIColor whiteColor];
    }

希望这有所帮助。

1
准确的解决方案在Vern Jensen的评论中提到。似乎并不适用于所有情况。 - zambrey

1
问题是一个iOS的bug - 对于iOS7.0.4,这个问题不再存在。我不知道它是在哪个版本中被修复的。因此,在viewWillAppear中不需要reloadData或设置separatorColor。在viewDidLoad中进行这些操作就足够了。

0
两个建议:
1. 不要使用UITableViewController。它提供的自动化行为可以通过几个调用轻松实现,而且它违反了良好的OOP实践。
2. 关于分隔符,不要显示分隔符,但在每个单元格底部添加一个UIView,宽度等于单元格的宽度,高度为1点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接