Как скрыть раздел в UITableView? - PullRequest
26 голосов
/ 30 июня 2009

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

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

Ответы [ 12 ]

52 голосов
/ 15 мая 2011

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

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

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

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

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

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

22 голосов
/ 30 июня 2009

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

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

14 голосов
/ 16 апреля 2012

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

Вид хака, но это работает.

5 голосов
/ 12 апреля 2012

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

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

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
2 голосов
/ 13 мая 2010

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

2 голосов
/ 02 февраля 2010

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

1 голос
/ 16 июля 2015

Если вы вернете 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;
}
1 голос
/ 26 июня 2014

Вы можете установить высоту отдельных строк раздела на 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;
    }
}
1 голос
/ 30 июня 2009

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

0 голосов
/ 14 мая 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...