Как предотвратить изменение цвета разделителя UITableView в UIPopoverController (iOS7)?

В моем приложении используется UITableViewController, который является дочерним элементом UINavigationController, который является контроллером представления содержимого UIPopoverController. Я настраиваю внешний вид UITableView UITableViewController. Он отлично работает для iOS 5 и 6, но у него есть проблема в iOS7. Сепараторы ячеек имеют белый цвет, а представление таблицы сначала отображается с правильным цветом разделителя. Однако, как только я просматриваю представление таблицы, и ячейки перезагружаются (это означает, что вызываются функции cellForRowAtIndexPath и willDisplayCell), разделители вновь перезагруженных ячеек все черные.

Я настраиваю цвет разделителя, вызывая эту функцию в функции UITableViewController viewDidLoad:

self.tableView.separatorColor = [UIColor whiteColor];

Если я использую тот же самый вид таблицы в другом месте приложения (не в UIPopoverController), тогда у меня нет этой проблемы.

Насколько я могу судить, в документации нет ничего, чтобы указать, что это должно работать по-разному для iOS 7, чем для 5 или 6. Может быть, это ошибка iOS? Любая помощь будет высоко оценена.

Ответ 1

Проблема была ошибкой iOS - проблема больше не возникает для меня для iOS7.0.4. Я не знаю точно, в какой версии он был исправлен. Поэтому нет необходимости перезагружатьData или устанавливать separatorColor в viewWillAppear. Достаточно сделать это в viewDidLoad.

Ответ 2

установите это значение в viewwillAppear

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

надеюсь, что это поможет

Ответ 3

Эта ошибка iOS все еще встречается в iOS7.0.6. У меня был стол с черным фоном и белыми разделительными линиями. Строки разделителя отображались правильно на белом фоне при первом просмотре UIPopover, но на втором и последующих отображениях того же popover появились черные.

Использование 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, тогда заметна задержка до того, как линии разделителя станут белыми, после отображения popover. Использование BOTH обеспечивает самый визуальный результат для пользователя.

2) Если ваша таблица имеет более одного раздела, вы должны убедиться, что все разделы перезагружены, поскольку пользователь может прокручиваться в другую секцию до того, как popover был скрыт.

PS - После дальнейшего тестирования я обнаружил, что даже это решение не идеально. После повторного отображения, если вы прокрутите таблицу, разделители, которые изначально были за кадром, снова возвращаются к черному. Следовательно, он работает правильно, только если таблица не имеет достаточного количества строк, чтобы выйти за пределы размера popover.

Ответ 4

Две рекомендации:
1. Не используйте UITableViewController вообще. Автоматическое поведение, которое он предоставляет, может быть легко реализовано с помощью нескольких вызовов, а также нарушает хорошие методы OOP.
2. О разделителях, не показывайте разделители, но добавьте UIView в каждую ячейку внизу с шириной, равной ширине ячейки и высоте 1 точки.