Изменение цвета фона в UITableViewHeaderFooterView, загруженном из xib, говорит, что вместо этого используйте contentView.backgroundColor
Я создаю UITableViewHeaderFooterView из xib файла, и почти все работает правильно.
Проблема в том, что теперь, когда я пытаюсь изменить цвет фона (или если у меня был один настроенный в xib), он будет постоянно выводить это сообщение на консоль:
Установка цвета фона в UITableViewHeaderFooterView устарела. Вместо этого используйте contentView.backgroundColor.
Это означает, что у меня две проблемы:
- Если я не хочу видеть это предупреждение, я должен избавиться от цвета фона в файле xib. (Это нежелательно, потому что тогда это означает, что мой xib больше не отражает то, как будет выглядеть представление во время выполнения).
- Когда я пытаюсь изменить цвет фона с помощью кода, я получаю предложение
contentView.backgroundColor
, но когда я пытаюсь следовать этому предложению, ничего не происходит. (Это потому, что contentView
есть nil
.)
Примечание. Здесь есть похожий вопрос, но это было главным образом связано с отключением сообщения, а не с поиском альтернативного решения, которое разрешает обе проблемы выше.
Обновление: Чтобы быть ясным, я хочу продолжить использование xib файла для представления заголовка и хочу иметь возможность вызывать dequeueReusableHeaderFooterViewWithIdentifier:, чтобы таблица могла быть эффективной при управлении представлениями.
Ответы
Ответ 1
Вот лучший способ, который я нашел для решения этой проблемы:
- Reset цвет фона вашего
UITableViewHeaderFooterView
по умолчанию.
- Добавьте один вид прямо под экземпляр вашего
UITableViewHeaderFooterView
и назовите его "Просмотр содержимого". (Это именно то, что Apple делает с UITableViewCell
, и мы просто имитируем эту структуру.)
- Теперь вы можете изменить цвет фона в представлении контента как угодно в файле xib.
- Поместите любые другие представления
inside
Content View
.
- Переопределите свойство
contentView
в методе расширения и добавьте IBOutlet
к его определению. (См. Код ниже.)
- Свяжите свойство с созданным контентом, как и с любым IBOutlet.
- Теперь вы можете изменить цвет фона с помощью
contentView.backgroundColor
в коде, как указано в сообщении об ошибке.
.h файл:
@interface ABCHeaderView : UITableViewHeaderFooterView
@end
.m file:
@interface ABCHeaderView ()
@property (nonatomic, readwrite, retain) IBOutlet UIView *contentView;
@end
@implementation ABCHeaderView
@synthesize contentView;
@end
Эта иерархия согласуется с документацией Apple:
Если у вас есть настраиваемый контент для отображения, создайте субвью для своего контента и добавьте их в представление в свойстве contentView.
Ответ 2
Чтобы избавиться от предупреждения, вы не должны устанавливать цвет фона. Проблема заключается в том, что вы создаете TableHeader таким образом, IB не предоставляет для этого специальный объект. Удаление цвета фона в исходном коде будет отличным решением описанной проблемы всего за несколько кликов.
Ответ 3
Это работает для меня:
-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
UITableViewHeaderFooterView *headerView=(UITableViewHeaderFooterView *)view;
[headerView.backgroundView setBackgroundColor:[[UIColor blackColor]colorWithAlphaComponent:0.4]];
}
Ответ 4
Установка цвета фона в UITableViewHeaderFooterView была осуждается. Вместо этого используйте contentView.backgroundColor.
Это может произойти, если вы создадите свой заголовок в отдельном файле xib и установите фон основного UIView там.
Чтобы решить эту проблему, верните цвет фона UIView в цвет по умолчанию в InterfaceBuilder и установите цвет фона в методе viewForHeaderInSection: section.
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderXibFileName") as! CustomHeader
header.contentView.backgroundColor = UIColor.blueColor
}
Как вы видите, мы используем header.contentView.backgroundColor
, а не header.backgroundColor
(это то, что фактически делал файл xib).
Ответ 5
Установите contentView.backgroundColor в обратном вызове делегата willAppear:
- (void)tableView:(UITableView *)tableView
willDisplayHeaderView:(UIView *)view
forSection:(NSInteger)section
или
- (void)tableView:(UITableView *)tableView
willDisplayFooterView:(UIView *)view
forSection:(NSInteger)section
Ответ 6
Как насчет использования кода для создания пользовательского заголовка и его размещения?
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section {
UIView * myHeader = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 320, 40)];
[myHeader setBackgroundColor:[UIColor grayColor]];
UILabel * TitleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10, 5, 320, 20)];
TitleLabel.text = @"My Title";
[myHeader addSubview:TitleLabel];
return myHeader;
}