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

Posted

技术标签:

【中文标题】如何防止 UITableView 分隔符颜色在 UIPopoverController (iOS7) 中变黑?【英文标题】:How do I prevent UITableView separator color from turning black in UIPopoverController (iOS7)? 【发布时间】:2013-09-30 16:13:37 【问题描述】:

我的应用程序使用 UITableViewController,它是 UINavigationController 的子级,它是 UIPopoverController 的内容视图控制器。我正在自定义 UITableViewController 的 UITableView 的外观。它适用于 ios 5 和 6,但在 iOS7 中存在问题。单元格的分隔符设置为白色,表格视图最初以正确的分隔符颜色显示。但是,一旦我滚动表格视图并重新加载单元格(这意味着调用了 cellForRowAtIndexPath 和 willDisplayCell 函数),新重新加载的单元格的分隔符都是黑色的。

我通过在 UITableViewController 的 viewDidLoad 函数中调用这个函数来自定义分隔符颜色:

self.tableView.separatorColor = [UIColor whiteColor];

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

据我所知,文档中没有任何内容表明 iOS 7 的工作方式与 5 或 6 的工作方式不同。也许这是一个 iOS 错误?任何帮助将不胜感激。

【问题讨论】:

您是打算移除表格分隔符还是您的表格很暗?顺便说一句,在 iOS7 中有很多这样的小故障。 表格视图单元格是彩色的,因此分隔符在白色时可见。所以我不希望它们被删除。 我在 iPad 上的弹出框内的表格视图中看到了类似的问题。原因似乎是由于在表格视图出现之前重新加载了它 - 如果我不这样做,而是在它被添加到屏幕后重新加载它,它会稍微好一点。 自从我遇到这个问题以来,我一直无法找到任何解决方案,而且它看起来确实像一个 iOS7 UIKit 错误。我已向 Apple 提交了该错误,但尚未收到任何回复。 有同样的问题。尝试在 ViewController 的 viewWillAppear 方法 () 中调用 setSeparatorColor(),而这里 setSeparatorColor() 在第二次和第 n 次调用时都没有效果。只有第一个。看起来确实是个bug。感谢您向 Apple 提交申请。 【参考方案1】:

viewwillAppear中设置这个

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
        self.tableView.separatorColor = [UIColor whiteColor];
    

希望对你有帮助

【讨论】:

Vern Jensen 的评论中提到了确切的解决方案。似乎并不适合所有人。【参考方案2】:

问题是 iOS 错误 - 对于 iOS7.0.4,我不再出现此问题。我不确切知道它是在哪个版本中修复的。因此无需在 viewWillAppear 中重新加载数据或设置 separatorColor。在 viewDidLoad 中执行此操作就足够了。

【讨论】:

【参考方案3】:

这个 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 代码,那么在显示弹出框之后分隔线变为白色之前会有明显的延迟。使用 BOTH 可为用户提供视觉上最无缝的结果。

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

PS - 经过进一步测试,我发现即使是这个解决方案也不完美。重新显示后,如果滚动表格,最初在屏幕外的分隔符会再次恢复为黑色。因此,只有当表格没有足够的行超出弹出框的大小时,它才能正常工作。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于如何防止 UITableView 分隔符颜色在 UIPopoverController (iOS7) 中变黑?的主要内容,如果未能解决你的问题,请参考以下文章

页脚视图的颜色总是比 UITableView 分隔符的颜色深

iOS 7 中的 UITableView 分隔符颜色是啥?

UITableView 奇怪的分隔线颜色

iOS7上的UITableView分隔符颜色错误

为 tableview (UITableView) 绘制一个自定义单元格,更改颜色和分隔符颜色和宽度

选择单元格时 UITableView 分隔符颜色发生变化