Как скрыть UITableViewSections в Swift?

у меня есть статическое сгруппированное табличное представление, которое имеет 5 разделов (все разделы имеют верхние колонтитулы, без нижних колонтитулов). Я создал все это с помощью раскадровки. Теперь, как я могу скрыть первый / верхний UITableViewSection (включая заголовок). Я попытался сделать выход в UITableViewSection, но он говорит мне, что он недействителен (необъявленный тип):

@IBOutlet var section: UITableViewSection!

Я сделал это так, потому что я планирую сделать:

section.hidden = true

не может ли это быть сделано таким образом?

мой делегаты и источники данных настроены правильно 100%.

4 ответов


вы можете использовать метод делегата:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  if(section == 0)
    return 0.0
}

если вы не хотите ячеек в определенном разделе, используйте метод делегата:

func numberOfRowsInSection(section: Int) -> Int {
  if (section == 0) {
    return 0
  }
  else {
  // return the number of rows you want
  }
}

редактировать (решение проблемы Timкомментарий)

чтобы получить правильный синтаксис:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if (section == 0) {
        return 0.0
    }
    return UITableViewAutomaticDimension
}

или аккуратнее switch-case синтаксис:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    switch section {
    case 0:
        return 0.0
    default:
        return UITableViewAutomaticDimension
    }
}

Я проверил оба, и они работают нормально.


0.0 не работает для меня. Я должен был это сделать, чтобы все получилось.

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    switch section {
    case 0:
        return 0.01
    default:
        return UITableViewAutomaticDimension
    }
}

для тех, кто хочет скрыть разделы, потому что они используют статический сгруппированный tableView с динамическим числом разделов, Решение ниже может помочь. В моем случае каждый раздел с данными для отображения должен иметь пользовательский заголовок. Любой раздел, который не имеет данных, должен быть полностью скрыт.

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

в моем сценарии у меня есть до 12 записей в массиве, который я хочу показать в до 12 разделах (среди других разделов в сгруппированном tableView). Если для отображения требуется менее 12 записей, я хочу скрыть ненужные разделы, предоставив им 0 высот и 0 строк. Я также хотел скрыть headerView.

для этого я сделал следующее:

  1. настройте свой tableView в соответствии с отличным ответом @sasquatch дал выше.
  2. в разделе numberOfRowsInSection (раздел: Int) и tableView(_ tableView: UITableView, heightforheaderinsection раздел: Int) функции, проверьте, должны ли строки/высота быть 0.

В моем случае, я использовал разделы 1 - 12 для моего динамических данных, поэтому я использовал код, как показано ниже:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    //For section 0 and 13, just 1 row is ok
    if section == 0 || section == 13 {
        return 1
    }

    //For sections 1 - 12, determine if we have data to populate it, or if we should hide it
    if section <= dynamicDataToDisplay.count {
        return 2
    }

    //If it's section 1 - 12, but we don't have a corresponding data entry in dynamicDataToDisplay, then just return 0 rows
    return 0

}

код для функции heightForHeader аналогичен по логике:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    switch section {

    case 0:
        return 45.0
    case 13:
        return UITableViewAutomaticDimension
    default:
        if dynamicDataToDisplay.count >= section {
           return 25.0
        } else {
            return 0.0
        }

    } //end switch

}

даже после настройки этих функций я обнаружил, что все еще получаю заголовки разделов, которые я хотел скрыть. Наверное, я думал, что viewForHeaderInSection не будет вызываться, если numberOfRows равно 0, а heightOfHeader также равен 0, но он все еще вызывается.

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

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    //set up header for dynamic data sections
    if 1 ... 12 ~= section  {

        if tableView.numberOfRows(inSection: section) == 0 {
            return nil
        }
        //Continue with the header set up for valid sections with rows to display data

        ......
    }
}

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


для группы UITableView со статическими ячейками работает только это решение:

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    let count = self.tableView(tableView, numberOfRowsInSection: section)
    if count == 0 {
        return CGFloat(Double.leastNormalMagnitude)
    }
    return 44.0
}