Подтвердить что ты не робот

Как скрыть раздел в UITableView?

В таблице есть раздел, который не содержит никаких данных и хотел бы скрыть этот раздел.

Как это сделать?

4b9b3361

Ответ 1

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

Дополнительная информация: Ссылка на класс UITableView

Ответ 2

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

Внедрить протокол UITableViewDataSource:

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Так я обычно использую:

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

Ответ 5

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

Ответ 6

Вы также можете вернуть количество записей, содержащих данные из 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, если с несколькими вызовами подпрограмм. Рад, что я думал о хорошем старом методе переключения, может быть, это и помогает: -)

Ответ 7

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

Ответ 8

Вы можете установить высоту строк в этом разделе равным 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;
    }
}

Ответ 9

Попробуйте следующее: -

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

Ответ 10

Если вы вернете 0 для высоты раздела, Apple API проигнорирует его. Поэтому просто верните небольшое значение больше 0.

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

  return 44;
}

Также реализуйте представление для заголовка и возврата nil для раздела, который вы не хотите показывать.

- (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;
}

Ответ 11

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

Шаг первый: реализуем два 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
}

Шаг второй: определите функцию, чтобы установить ячейки, скрытые для определенного раздела, и вызвать их из 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. Таким образом, вы можете контролировать, когда нужно сделать конкретный раздел видимым или скрытым.

Ответ 12

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

#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... текст заголовка заголовка/нижнего колонтитула по-прежнему будет отображаться