Вопрос в стиле разделителя UITableView

#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: .

Это означает, что стиль не изменится для ячеек, которые уже загружены. Простая прокрутка таблицы для принудительного перерисовывания ячеек должна привести к появлению разделителей…

Затем вам нужно :

  1. установите его ПЕРЕД вставкой ячейки

    или

  2. перезагрузите 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];
  

Итак, даже если каким-то образом вышеупомянутое не вызывается и разделитель все еще сохраняется — он будет того же цвета, что и то, что за ним, поэтому невидимый.

Удачи.