Как мы можем скрыть tableHeaderView и tableFooterView?

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

У меня есть две кнопки, которые я добавляю в одну в нижнем колонтитуле таблицы, а другую в заголовке таблицы, я знаю, как скрыть верхний колонтитул таблицы, используя этот код table.tableHeaderView.hidden = YES; но проблема в том, что в верхней части таблицы все еще остается свободное место.Это пространство равно размеру представления заголовка, но представление скрыто .В нем все еще есть место.Как мы можем отключить заголовок таблицы, удалив это пространство.Я надеюсь, что вы, гениальные разработчики, понимаете мой вопрос.Пожалуйста, помогите мне. Заранее спасибо.

Ответ №1:

Вместо того, чтобы скрывать вид заголовка, вы должны сделать,

 tableView.tableHeaderView = nil
  

И позже, если вы захотите это показать, просто назначьте это снова,

 tableView.tableHeaderView = tableHeaderView;
  

В Swift:

 class myTableViewController: UITableViewController {

    @IBOutlet var tableHeaderView: UIView!

    private func toggleHeaderView() {
        if tableView.tableHeaderView == nil {
            tableView.tableHeaderView = tableHeaderView 
        } else { 
            tableView.tableHeaderView = nil 
        }
    }

}
  

на вашей раскадровке просто перетащите UIView в табличное представление. Это «волшебным образом» станет заголовком представления таблицы (если вы сделаете другой, он станет нижним колонтитулом представления таблицы). ОДНАКО вы должны щелкнуть на этом представлении заголовка и перетащить ссылочный выход на контроллер представления таблицы и связать его с «tableHeaderView» … эта часть не является «волшебной».

Обратите внимание, что из-за «!» в объявлении вы должны не забыть перетащить ссылку на Storyboard, иначе вы получите ошибку времени выполнения во время тестирования, так что это хорошо.

Комментарии:

1. Вы должны назначить представление снова. Смотрите мой обновленный ответ, сэр 😉

2. При использовании ARC обязательно объявите ‘theHeaderView’ как ‘strong’, например так: @property (strong, неатомный) IBOutlet UIView *theHeaderView ; В противном случае он будет освобожден и ему будет присвоено значение nil, что приведет к сбою приведенного выше кода ‘show’. Сбой.

3. Дэниел, ты спас меня. У меня был слабый IBOutlet, и мой view постоянно освобождался.. не удалось разобраться.

4. Когда я устанавливаю tableHeaderView равным нулю, вверху все еще остается пустое пространство.

5. Я не рекомендую привязывать tableHeaderView в storyboard к вашему локальному headerHolder в качестве выхода. Если вы сделаете это, и в tableHeaderView будут подключены какие-либо другие представления в качестве выходов, они станут равными нулю, когда вы установите TableView.tableHeaderView равным нулю. Вместо этого просто создайте локальную переменную для хранения headerHolder, а в viewDidLoad сделайте headerHolder = TableView.tableHeaderView

Ответ №2:

Попробуйте:

 tableView.tableHeaderView?.removeFromSuperview()
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))
tableView.layoutIfNeeded()
  

Установите UIView с высотой в виде CGFloat.leastNonzeroMagnitude вместо ‘0’.
Это удалит пустое пространство, появляющееся вверху после удаления tableViewHeader.
У меня это сработало.

Комментарии:

1. В ObjectiveC используйте CGFLOAT_MIN вместо CGFloat.leastNonzeroMagnitude

2. когда я создаю TableView.tableHeaderView = nil , это приводит к ошибкам компоновки. Ваш ответ помог мне, спасибо!

3. tableView.tableHeaderView = UIView(frame: .zero)

Ответ №3:

Если вы создали свой вид в storyboard, вы можете временно скрыть его с помощью

tableView.tableHeaderView?.frame = CGRect.zero

Чтобы отобразить его снова, используйте

tableView.tableHeaderView?.frame = CGRect(x: 0, y: 0, width: tableView.frame.width, height: 50)

Ответ №4:

 [self.tableView.tableHeaderView removeFromSuperview];
self.tableView.tableHeaderView = nil;
[self.tableView reloadData];
  

Ответ №5:

 //hidden sectionFooter

- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:    (NSInteger)section {
    return 0.0;
}
  

Комментарии:

1. В данном случае я не согласен. Код говорит сам за себя, и это правильный ответ.

2. К сожалению, это неправильный ответ, поскольку вопрос касался tableHeaderView. Ответ касается раздела верхние и нижние колонтитулы, который является чем-то совершенно другим.

Ответ №6:

removeFromSuperview или установить nil не работает при «reloadData»

 self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, 0.001f)];
[self.tableView reloadData];
  

Ответ №7:

Часто вид-призрак заголовка будет продолжать появляться после того, как вид заголовка был установлен с помощью «viewForHeaderInSection», а позже программно скрыт или установлен в ноль. Чтобы это полностью исчезло, явно установите sectionHeaderHeight = 0.

Objective C:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section
{
    if (self.viewMode == SectionHeaderShouldBeHidden)
    {
        tableView.sectionHeaderHeight = 0;
        return nil;
    }
    else if (self.viewMode == SectionHeaderShouldAppear)
    {
        //section text as a label
        UILabel *lbl = [[UILabel alloc] init];
        lbl.textAlignment = NSTextAlignmentCenter;
        lbl.font = [UIFont boldSystemFontOfSize:13];
        lbl.textColor = [UIColor whiteColor];
        [lbl setBackgroundColor:App.secondaryColor];
        tableView.sectionHeaderHeight = 20;

        if (self.queryResultsViewModel.items.count == 0)
            return lbl;

        lbl.text = @"Section Header Text";

        return lbl;
    }
}
  

Swift 4 :

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

    if !self.viewMode == HeaderShouldBeShown
    {
        self.listView.sectionHeaderHeight = 0
        return nil
    }

    let lbl: UILabel = UILabel.init()
    lbl.textAlignment = NSTextAlignment.center
    lbl.font = UIFont.boldSystemFont(ofSize: 13)
    lbl.textColor = UIColor.white
    lbl.backgroundColor = UIColor.black
    tableView.sectionHeaderHeight = 20
    lbl.text = "Section Header Text"
    return lbl
}
  

Ответ №8:

 if tableView.tableHeaderView == nil{ 
tableView.tableHeaderView = self.headerHolder 
}
else
{
 tableView.tableHeaderView = nil 
}
}
  

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