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

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

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

Ответы на вопрос(12)

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

даже в середине табличного представления вам понадобится все следующее

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

 14 нояб. 2018 г., 08:49
длинный кодовый блок, но работает.
 06 февр. 2019 г., 17:36
Это все еще оставит немного места для пустого раздела. Очень легко увидеть с двумя таблицами рядом в контроллере splitview.

с заголовком раздела, если хотите. Источник данных все еще будет там, но не появится.

Section Rows

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        if (_shouldHidden) {
            return 0.0;
        }
        else {
            return 55.0;
        }
    }
    else {
        return 55.0;
    }
}
 14 нояб. 2018 г., 08:40
Что делать, если раздел имеет верхний и нижний колонтитулы? переопределим ли мы еще 4 метода, чтобы скрыть это? слишком много ненужной работы, но все еще нет правильного способа достичь этого решения.

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

РеализоватьUITableViewDataSource протокол:

Return all section names (even hidden ones) in - the sectionIndexTitlesForTableView method.

For each empty section, return nil from the titleForHeaderInSection method.

For each empty section return 0 for the numberOfRowsInSection method.

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

 06 мар. 2013 г., 12:25
отличный! Спасибо :)
 02 февр. 2012 г., 14:03
Это идеально подходит для простой таблицы со стандартными заголовками - без проблем с пробелами.
 03 окт. 2011 г., 00:54
Увидетьstackoverflow.com/questions/2495936/… для избавления от заданного по умолчанию расстояния между колонтитулами.
 16 авг. 2011 г., 07:14
Не работает для меня - "скрытый" секции все еще занимают вертикальное пространство, что весьма заметно, когда их несколько. Облом, потому что это было элегантное решение!
 13 июн. 2017 г., 00:25
Это должен быть правильный ответ.

которые содержат данные из numberofSectionsInTableView: метод и использовать switch(indexPath.section) where you let the empty records 'fall through' to the next switch, like:

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

 04 окт. 2011 г., 07:50
Что произойдет, если в первой записи нет данных, а во второй записи? Секция == 1 провалится в дело 1 и вернет ячейку дела 2. Но Секция == 2 не знала бы, что Случай 1 провалился, и также вернула бы Ячейку Случая 2, когда вы хотите, чтобы она возвратила Ячейку Случая 3.
Решение Вопроса

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

Больше информации:Ссылка на класс UITableView

 14 нояб. 2016 г., 09:26
@Claus Как это сделать & # xFF1F;
 19 февр. 2013 г., 20:16
@ Клаус: этот ответ довольно старый. Вы могли бы рассмотретьasking a new question, Вкратце, похоже, вам нужно обновить значение, которое вы возвращаете из своего-numberOfSectionsInTableView: метод источника данных. Ошибка указывает на то, что вы начинаете с трех разделов, удаляете один, а затем утверждаете, что у вас осталось три раздела.
 20 февр. 2013 г., 16:39
Спасибо! Я нашел более простой способ установить номер строки для раздела в 0 и удалить вид заголовка раздела.
 19 февр. 2013 г., 17:24
Я использовал это:[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:nil];   но я получаю это сообщение: «Неверное обновление: недопустимое количество разделов. Количество разделов, содержащихся в табличном представлении после обновления (3), должно быть равно количеству разделов, содержащихся в табличном представлении до обновления (3), плюс или минус количество вставленных или удаленных разделов (0 вставлено, 1 . удаленные) & APOS; Любая идея?

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

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

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
 09 нояб. 2012 г., 06:05
Я не заметил такой проблемы. Я посмотрю, как только у меня будет время. Спасибо за указание на проблему.
 07 нояб. 2012 г., 12:00
Это работает, но проблема в том, что клетки под ним не двигаются вверх. В моем случае клетки находятся на нижнем столе, и решение хорошее.

Apple API проигнорирует это. Так что просто верните небольшое значение больше 0.

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

  return 44;
}

Также внедрите view для header и верните 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;
}

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

Step one: реализовать два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
}

Step two: определите функцию для установки ячеек, скрытых для определенного раздела, и вызовите ее из 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() снова.

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

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

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

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

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

 14 мая 2017 г., 22:18
также вы можете использовать предопределенный CGFLOAT_MIN для небольшого числа
 17 апр. 2013 г., 08:14
Brilliant! Это было решением для сгруппированного табличного представления и работает на iOS 6.

Ваш ответ на вопрос