2009-06-30 4 views

ответ

21

Вы не можете «скрыть» раздел как таковой, но вы можете «удалить» его из представления таблицы с помощью метода deleteSections:withRowAnimation:. Это удалит его из представления с дополнительной анимацией, не затрагивая ваши данные резервного копирования. (Вы должны, однако, обновлять данные в любом случае, так что раздел не появляется.)

Подробнее: UITableView class reference

+1

Я использовал это: '[self.tableView deleteSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation: ноль];' но Я получаю ive это сообщение: 'Неверное обновление: неверное количество разделов. Количество разделов, содержащихся в представлении таблицы после обновления (3), должно быть равно количеству разделов, содержащихся в представлении таблицы перед обновлением (3), плюс или минус количество вставленных или удаленных разделов (вставлено 0, 1 удален). Любая идея? – Claus

+1

@ Клаус: этот ответ довольно старый. Вы можете рассмотреть [задание нового вопроса] (http: // stackoverflow.ком/вопросы/предложения). Вкратце, однако, похоже, вам нужно обновить значение, возвращаемое с помощью метода источника данных -numberOfSectionsInTableView:. Ошибка указывает, что вы начинаете с трех разделов, удаляете один, а затем утверждаете, что у вас все еще осталось три раздела. – Tim

+0

спасибо! Я нашел более простой способ установить количество строк для раздела в 0 и удалить заголовок заголовка раздела. – Claus

1

Возможно, вам необходимо удалить сам раздел из данных, поддерживающих таблицу. Я не думаю, что есть что-то, что позволяет просто скрыть раздел.

2

Вы можете установить количество строк в этом разделе 0. Тем не менее, он оставит заметная пустое место, где оно было раньше.

2

Вы также можете вернуть число записей, которые действительно содержат данные из метода numberofSectionsInTableView: и использовать switch(indexPath.section) где вы позволяете «проваливаются» в пустой записи в следующем коммутаторе, как:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    switch (indexPath.section) { 
     case 0: 
      return <header cell>; 
      break; 

     case 1: 
      if(firstRecordHasData){ 
       return <second cell>; 
       break; 
      } 

     case 2: 
      if(secondRecordHasData){ 
       return <second cell>; 
       break; 
      } 

     case 3: 
      return <some other cell>; 
      break; 

     default: 
      return <a regular cell>; 
      break; 
    } 
} 

Я боролся с этим некоторое время, потому что мне пришлось оставить разделы в середине сгруппированного стола. Пробовал настройку высоты ячейки, верхнего и нижнего колонтитула до 0,0, но это не сработало. Не удалось просто удалить определенные разделы из-за вызываемых методов в зависимости от выбранной строки. Это было бы огромным, если бы ... если бы ... else, если с несколькими вызовами подпрограмм. Рад, что я подумал о хорошем старом методе переключения, может быть, это вам и поможет :-)

+1

Что произойдет, если первая запись не имеет данных, а вторая запись? Раздел == 1 попадает в регистр 1 и возвращает ячейку Case 2. Но Раздел == 2 не знал бы, что Case 1 провалился и также вернет ячейку Case 2, когда вы захотите вернуть ячейку Case 3. – jamesmoschou

49

Собственно, вы можете «скрыть» раздел. Если вы хотите использовать подобное поведение для встроенного в приложение Контакты, где участки скрыты, но все перечисленные в индексе по праву можно сделать следующее:

Реализация UITableViewDataSource протокола:

  • Возвратите все названия разделов (даже скрытые) в - метод sectionIndexTitlesForTableView.

  • Для каждого пустого участка возвратите nil из метода titleForHeaderInSection.

  • Для каждой пустой части возврата 0 для метода numberOfRowsInSection.

Я считаю, что это работает лучше, чем удаление разделов, поскольку пользователь имеет последовательную навигацию индекса.

+11

Не работает для меня - «скрытые» разделы по-прежнему занимают вертикальное пространство, что довольно заметно, когда есть несколько из них. Bummer, потому что это было изящное решение! – Chris

+2

См. Http://stackoverflow.com/questions/2495936/grouped-uitableview-shows-blank-space-when-section-is-empty/4007285#4007285, чтобы избавиться от интервала между заголовком и нижним колонтитулом. – smparkes

+1

Это идеальное решение для простого стола со стандартными заголовками - без проблем с интервалом. –

5

Я не согласен с Тимом. У нас есть способ получить доступ к любому разделу/строке таблицы из любого места в нашем коде и изменить его свойство .hidden (и все другие свойства).

Это способ, которым я обычно использую:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2]; 
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES; 
+1

Это работает, но проблема в том, что ячейки под ним не двигаются вверх. В моем случае ячейки находятся в нижней таблице, и решение хорошее. –

+0

Я не заметил такой проблемы. Я посмотрю, как только я получу время. Спасибо, что указал на проблему. – Deepukjayan

12

Это правда, что 0 не является допустимой высота для верхних и нижних колонтитулов. Однако высоты - значения CGFloat.Вы можете указать очень небольшое число (я использовал 0.1) для высоты верхних и нижних колонтитулов раздела.

Вид взлома, но он работает.

+0

Блестящий! Это было решение для сгруппированного представления таблицы и работает на iOS 6. – Daniel

+0

также вы можете использовать предопределенный CGFLOAT_MIN для небольшого числа – Hofi

1

Вы можете установить высоту строк в секции до 0. Кроме того, с заголовком раздела, если хотите. Источник данных все равно будет присутствовать, но не появится.

Раздел Ряды

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) { 
     if (_shouldHidden) { 
      return 0.0; 
     } 
     else { 
      return 55.0; 
     } 
    } 
    else { 
     return 55.0; 
    } 
} 
0

Попробуйте так: -

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    CGFloat headerHeight=10.f; 
    if (section==0) 
    { 
     headerHeight=0.01f; 
    } 
    else 
    { 
     headerHeight=50.0f; 
    } 
    return headerHeight; 
} 
0

Если возвращать 0 для высоты секции, Apple API будет игнорировать его. Так просто возвращают небольшое значение больше 0.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    if (section == 0) { 
    return 1; 
    } 

    return 44; 
} 

также осуществлять представление для заголовка и возвращает ноль для секции вы не хотите показывать.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    if (section == 0 && !self.personaCells.count) { 
    return nil; 
    } 

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)]; 
    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20, headerView.frame.size.width, 20)]; 
    NSString *headerTitle = @"SAMPLE TITLE"; 
    headerLabel.text = headerTitle;  
    [headerView addSubview:headerLabel]; 
    return headerView; 
} 
0

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

Шаг один: реализовать два func определены в UITableViewDelegate - heightForRowAt - heightForHeaderInSection

К примеру, вот быстрые коды:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
{ 
    // if indexPath contains the specified section AND 
    // the condition for hiding this section is `true` 
    //  return CGFloat(0) 
    // else 
    // return super.tableView(tableView, heightForRowAt: indexPath) 
} 

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat 
{ 
    // similar logic to set header height 
} 

Шаг два: определить FUNC, чтобы установить ячейки, скрытые для конкретного раздела и вызывающие его из viewWillAppear:

private func setSectionVisible() 
{ 
    /* 
    if condition for visible is true 
     let index = IndexPath(row:..., section:...) 
     let cell = self.tableView.cellForRow(at: index) 
     cell.isHiden = true 
    */ 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.setSectionVisible() 
} 

Если вам нужно перезагрузить табличное представление, вам может потребоваться снова позвонить setSectionVisible().

Я думаю, что эта стратегия может работать для динамических данных из DataSource. Таким образом, вы можете контролировать, когда сделать конкретный раздел видимым или скрытым.

0

Для скрытия раздела, даже в середине представления таблицы вы должны были бы все следующие

#define DEBUG_SECTION 1 

#if ! DEBUG_BUILD 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    if (section == DEBUG_SECTION) 
     return CGFLOAT_MIN; 
    return [super tableView:tableView heightForHeaderInSection:section]; 
} 
//------------------------------------------------------------------------------ 

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
{ 
    if (section == DEBUG_SECTION) 
     return CGFLOAT_MIN; 
    return [super tableView:tableView heightForFooterInSection:section]; 
} 
//------------------------------------------------------------------------------ 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    if (section == DEBUG_SECTION) 
     return nil; 
    return [super tableView:tableView titleForHeaderInSection:section]; 
} 
//------------------------------------------------------------------------------ 

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section 
{ 
    if (section == DEBUG_SECTION) 
     return nil; 
    return [super tableView:tableView titleForFooterInSection:section]; 
} 
//------------------------------------------------------------------------------ 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == DEBUG_SECTION) 
     return 0; 
    return [super tableView:tableView numberOfRowsInSection:section]; 
} 
//------------------------------------------------------------------------------ 
#endif // #if ! DEBUG_BUILD 

если вы оставили из titleFor/headerFor ... вы получите некоторые пустые строки
если вы оставили из heightFor ... текст заголовка/колонтитул заголовок будет отображаться