Подтвердить что ты не робот

Изменение цвета фона в UITableViewHeaderFooterView, загруженном из xib, говорит, что вместо этого используйте contentView.backgroundColor

Я создаю UITableViewHeaderFooterView из xib файла, и почти все работает правильно.

Проблема в том, что теперь, когда я пытаюсь изменить цвет фона (или если у меня был один настроенный в xib), он будет постоянно выводить это сообщение на консоль:

Установка цвета фона в UITableViewHeaderFooterView устарела. Вместо этого используйте contentView.backgroundColor.

Это означает, что у меня две проблемы:

  • Если я не хочу видеть это предупреждение, я должен избавиться от цвета фона в файле xib. (Это нежелательно, потому что тогда это означает, что мой xib больше не отражает то, как будет выглядеть представление во время выполнения).
  • Когда я пытаюсь изменить цвет фона с помощью кода, я получаю предложение contentView.backgroundColor, но когда я пытаюсь следовать этому предложению, ничего не происходит. (Это потому, что contentView есть nil.)

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

Обновление: Чтобы быть ясным, я хочу продолжить использование xib файла для представления заголовка и хочу иметь возможность вызывать dequeueReusableHeaderFooterViewWithIdentifier:, чтобы таблица могла быть эффективной при управлении представлениями.

4b9b3361

Ответ 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 не предоставляет для этого специальный объект. Удаление цвета фона в исходном коде будет отличным решением описанной проблемы всего за несколько кликов.

  • Найдено заголовок .xib в Xcode
  • Щелкните правой кнопкой мыши - Открыть как → Исходный код
  • Найти цветной ключ: Cmd-F - "backgr"
  • Удалите его. В моем случае это была строка: <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  • Теперь вы можете изменить фон как:

    override func awakeFromNib() {
    
        backgroundView = UIView()
        backgroundView?.backgroundColor = UIColor.whiteColor()
    }
    

Ответ 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;
}