Как скрыть 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.
для этого я сделал следующее:
- настройте свой tableView в соответствии с отличным ответом @sasquatch дал выше.
- в разделе 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
}