В таблице есть раздел, который не содержит никаких данных и хотел бы скрыть этот раздел.Как скрыть раздел в UITableView?
Как это сделать?
В таблице есть раздел, который не содержит никаких данных и хотел бы скрыть этот раздел.Как скрыть раздел в UITableView?
Как это сделать?
Вы не можете «скрыть» раздел как таковой, но вы можете «удалить» его из представления таблицы с помощью метода deleteSections:withRowAnimation:
. Это удалит его из представления с дополнительной анимацией, не затрагивая ваши данные резервного копирования. (Вы должны, однако, обновлять данные в любом случае, так что раздел не появляется.)
Подробнее: UITableView class reference
Возможно, вам необходимо удалить сам раздел из данных, поддерживающих таблицу. Я не думаю, что есть что-то, что позволяет просто скрыть раздел.
Вы можете установить количество строк в этом разделе 0. Тем не менее, он оставит заметная пустое место, где оно было раньше.
Вы также можете вернуть число записей, которые действительно содержат данные из метода 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, если с несколькими вызовами подпрограмм. Рад, что я подумал о хорошем старом методе переключения, может быть, это вам и поможет :-)
Что произойдет, если первая запись не имеет данных, а вторая запись? Раздел == 1 попадает в регистр 1 и возвращает ячейку Case 2. Но Раздел == 2 не знал бы, что Case 1 провалился и также вернет ячейку Case 2, когда вы захотите вернуть ячейку Case 3. – jamesmoschou
Собственно, вы можете «скрыть» раздел. Если вы хотите использовать подобное поведение для встроенного в приложение Контакты, где участки скрыты, но все перечисленные в индексе по праву можно сделать следующее:
Реализация UITableViewDataSource
протокола:
Возвратите все названия разделов (даже скрытые) в - метод sectionIndexTitlesForTableView
.
Для каждого пустого участка возвратите nil
из метода titleForHeaderInSection
.
Для каждой пустой части возврата 0
для метода numberOfRowsInSection
.
Я считаю, что это работает лучше, чем удаление разделов, поскольку пользователь имеет последовательную навигацию индекса.
Не работает для меня - «скрытые» разделы по-прежнему занимают вертикальное пространство, что довольно заметно, когда есть несколько из них. Bummer, потому что это было изящное решение! – Chris
См. Http://stackoverflow.com/questions/2495936/grouped-uitableview-shows-blank-space-when-section-is-empty/4007285#4007285, чтобы избавиться от интервала между заголовком и нижним колонтитулом. – smparkes
Это идеальное решение для простого стола со стандартными заголовками - без проблем с интервалом. –
Я не согласен с Тимом. У нас есть способ получить доступ к любому разделу/строке таблицы из любого места в нашем коде и изменить его свойство .hidden (и все другие свойства).
Это способ, которым я обычно использую:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
Это работает, но проблема в том, что ячейки под ним не двигаются вверх. В моем случае ячейки находятся в нижней таблице, и решение хорошее. –
Я не заметил такой проблемы. Я посмотрю, как только я получу время. Спасибо, что указал на проблему. – Deepukjayan
Это правда, что 0 не является допустимой высота для верхних и нижних колонтитулов. Однако высоты - значения CGFloat.Вы можете указать очень небольшое число (я использовал 0.1) для высоты верхних и нижних колонтитулов раздела.
Вид взлома, но он работает.
Вы можете установить высоту строк в секции до 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;
}
}
Попробуйте так: -
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat headerHeight=10.f;
if (section==0)
{
headerHeight=0.01f;
}
else
{
headerHeight=50.0f;
}
return headerHeight;
}
Если возвращать 0 для высоты секции, Apple API будет игнорировать его. Так просто возвращают небольшое значение больше 0.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 0) {
return 1;
}
return 44;
}
также осуществлять представление для заголовка и возвращает ноль для секции вы не хотите показывать.
- (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;
}
В случае статической таблицы, то есть секции таблицы и ячейки, настроены в раскадровке. Ниже приведены мои стратегии скрыть указанные зависимости от условий раздела.
Шаг один: реализовать два 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
}
Шаг два: определить FUNC, чтобы установить ячейки, скрытые для конкретного раздела и вызывающие его из 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. Таким образом, вы можете контролировать, когда сделать конкретный раздел видимым или скрытым.
Для скрытия раздела, даже в середине представления таблицы вы должны были бы все следующие
#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 ... текст заголовка/колонтитул заголовок будет отображаться
Я использовал это: '[self.tableView deleteSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation: ноль];' но Я получаю ive это сообщение: 'Неверное обновление: неверное количество разделов. Количество разделов, содержащихся в представлении таблицы после обновления (3), должно быть равно количеству разделов, содержащихся в представлении таблицы перед обновлением (3), плюс или минус количество вставленных или удаленных разделов (вставлено 0, 1 удален). Любая идея? – Claus
@ Клаус: этот ответ довольно старый. Вы можете рассмотреть [задание нового вопроса] (http: // stackoverflow.ком/вопросы/предложения). Вкратце, однако, похоже, вам нужно обновить значение, возвращаемое с помощью метода источника данных -numberOfSectionsInTableView:. Ошибка указывает, что вы начинаете с трех разделов, удаляете один, а затем утверждаете, что у вас все еще осталось три раздела. – Tim
спасибо! Я нашел более простой способ установить количество строк для раздела в 0 и удалить заголовок заголовка раздела. – Claus