#iphone #objective-c #uitableview
#iPhone #objective-c #uitableview
Вопрос:
У меня есть tableview, который по умолчанию пуст. Пользователь может добавлять к нему ячейки.
Я хочу, чтобы разделительные линии были четкими, когда нет ячеек, и серыми, когда есть ячейки.
Я использую этот код:
if ([[self.fetchedResultsController fetchedObjects] count] == 0)
{
self.routineTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.routineTableView.separatorColor = [UIColor clearColor];
}
else
{
self.routineTableView.separatorColor = [UIColor grayColor];
}
Проблема в том, что когда я запускаю приложение с пустой таблицей, и если я добавляю ячейки, серых линий там нет, пока я не перезапущу приложение. Но если я начну с ячеек там, затем удалю их, затем повторно добавлю их, строки будут там. Есть предложения?
Комментарии:
1. Где вызывается этот код? Вызывается ли он перед добавлением ячейки?
2. он вызывается в
viewDidLoad
3. Какой регистр отображается при запуске приложения с пустой таблицей?
4.
if ([[self.fetchedResultsController fetchedObjects] count] == 0)
Ответ №1:
Может быть, вам этого не хватает?
...
else
{
self.routineTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; // or you have the previous 'None' style...
self.routineTableView.separatorColor = [UIColor grayColor];
}
Редактировать :
Вам нужно это, но не только это… Согласно документации Apple :
Значение этого свойства является одной из констант стиля разделителя, описанных в
UITableViewCell
Class Reference ссылка на класс.UITableView
использует это свойство для установки стиля разделителя в ячейке, возвращаемой от делегата вtableView:cellForRowAtIndexPath:
.
Это означает, что стиль не изменится для ячеек, которые уже загружены. Простая прокрутка таблицы для принудительного перерисовывания ячеек должна привести к появлению разделителей…
Затем вам нужно :
-
установите его ПЕРЕД вставкой ячейки
или
-
перезагрузите
tableView
при добавлении первой ячейки
что нелегко сделать с помощью NSFetchedResultsController
, вам следует обратиться к его делегату для решения … или изменить направление, например, скрыть tableView
, пока, возможно, у вас не будет результата…
ПРАВКА 2: вы также можете просто добавить это :
[self.tableView reloadData];
но это грязный обходной путь, который просто перезагрузит полный TableView, потеряв большинство преимуществ NSFetchedResultsController
…
Комментарии:
1. отредактировал мой ответ с объяснением… и грязный обходной путь, который должен сработать 🙂
2. к сожалению,
[self.routineTableView reloadData];
также не сработало3. вы установили
separatorStyle = UITableViewCellSeparatorStyleSingleLine
? в каком методе используется ваш код?4. Я добавил это, как вы и предлагали. Может быть, я могу просто скрыть tableview, если выборка равна нулю? вы знаете, как это сделать?
5. в любом случае, это было бы лучшим решением, имхо, чтобы скрыть разделитель, вы могли бы просто использовать self.routineTableView.hidden = YES; или добавить пустой UIView поверх него…
Ответ №2:
Быстрое решение, которое я обычно делаю, это:
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([tableView respondsToSelector:@selector(setSeparatorStyle:)]) {
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
}
}
Ответ №3:
Это изменяет логический флаг того, будет ли разделитель или нет. Поместите это в viewDidLoad:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
И чтобы убедиться, что вы действительно удалили это, установите для свойства seperatorColor значение, равное цвету фона представления и ячейки:
// If the background is white
self.tableView.separatorColor = [UIColor whiteColor];
Итак, даже если каким-то образом вышеупомянутое не вызывается и разделитель все еще сохраняется — он будет того же цвета, что и то, что за ним, поэтому невидимый.
Удачи.