Как создать представления UITableView sectionHeader в Интерфейсном Разработчике для iPhone?

У меня есть UITableView в сгруппированном стиле в моем приложении для iPhone. Теперь я хочу настроить заголовки раздела с Изображением, маркировкой и индикатором действия.

Чтобы сделать это, я создал новый подкласс UIViewController и файл XIB. Я добавил UIImageView, UILabel и UIActivityIndicatorView как свойства IBOutlet к ViewController и соединил их проводом к средствам управления, которые я поместил в XIB в Интерфейсном Разработчике.

В классе, где мой UITableView сделан, я устанавливаю заголовки раздела (два, оба экземпляра ViewController, определенного выше), и устанавливаю их свойства (изображение и текст). Затем я возвращаю представление ViewControllers в делегате tableView:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return [favoritesSectionHead view];
    } else {
        return [serverlistSectionHead view];
    }
}

Это отображает представление, когда я определил его в Интерфейсном Разработчике без пользовательского изображения и текста. Я знаю, почему это происходит (представление ViewController создается, когда сначала необходимый, в моем коде это - когда я возвращаю его в viewForHeaderInSection методе->, когда я пытаюсь установить пользовательские значения, представление является все еще нолем), но я не знаю, как зафиксировать это.

Можно ли помочь мне? Что я должен сделать к init представление перед своими возвратами? Документы UITableView говорят мне не называть "loadView" вручную...

Заранее спасибо, Mark.

1
задан Cornelius 20 July 2010 в 19:16
поделиться

2 ответа

Мне нужно было добавить свойство NSString в контроллер представления секции. В viewDidLoad я присвоил эту строку свойству UILabel text, теперь все работает.

0
ответ дан 2 September 2019 в 22:54
поделиться

У меня была такая же проблема с представлением = (null). Все дело в «делегатах». Мой tableView работал нормально, и все мои методы делегата UITableView работали правильно, однако viewForHeaderInSection: не реализовывался.

Я обнаружил, что Xcode позволял мне строить со слабосвязанной ссылкой с TableView, чего было недостаточно для метода «viewForHeaderInSection:».

Я также обнаружил, что Xcode легко протолкнет "закодированное" пользовательское представление из метода viewForHeaderInSection: с той же слабой ссылкой, но при использовании IB связь должна быть более надежной.Занимает немного больше работы, но предлагает гораздо лучший опыт, когда вы его освоите, чтобы строить гораздо более сложные объекты.

Я использовал: NSLog ([NSString stringWithFormat: @ "% @", self.headerView]); , чтобы убедиться, что представление выводилось как (null).

Метод viewForHeaderInSection: вызывается первым, если nil или null, tableView вызывает «titleForHeaderInSection:» следующим. (вы также можете использовать это в своих интересах).

Убедитесь, что ваша установка верна и имеет смысл в том, как объекты взаимодействуют друг с другом.

Примеры шагов, которые сработали для меня:
(.h)


  1. Правильно настройте viewController и объявите методы делегирования tableView. Я использовал общий UITableViewController, у меня не работал внутри сложной TabBar с UINavigationControllers.

     @interface YourViewController: UIViewController  {
    
  2. Создайте все IBOutlet, которые будут отображаться в вашем представлении:

     IBOutlet UITableView * myTableView;
    IBOutlet UIView * yourCustomHeaderView;
    IBOutlet UIImageView * yourImageOnCustomView;
    
  3. Назначить назначение распределения памяти:

      @property (неатомарно, сохранить) IBOutlet UITableView * yourTableView;
     @property (неатомный, сохранить) IBOutlet UIImageView * yourCustomHeaderView;
     @property (неатомный, сохранить) IBOutlet UIImageView * yourImageOnCustomView;
    

(.m)


  1. Синтезируйте свои переменные:

     @synthesize yourTableView, yourCustomHeaderView, yourImageOnCustomView;
    
  2. Реализуйте все необходимые методы стандартного делегата TableView, а также:

     - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) section {
    
     // Инициализируем заголовок View для представления:
    UIView * headerView;
    
     // Отображение заголовков разделов для строк:
    если (раздел == 0) {headerStatBar = self.yourCustomSectionHeaderView1;}
    if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
    if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
    
     // Возвращаем представление в Таблицу:
    return headerView;
    }
    
  3. Сделайте все свои Подключения в IB, самый простой способ:

    1. Просмотрите свои объекты с помощью «ВИДА СПИСКА», обеспечивает лучшее понимание и иерархию объектов.
    2. Щелкните правой кнопкой мыши «Владелец файла», чтобы отобразить все ваши IBOutlets;
    3. Перетащите все ваши подключения IBOutlet от владельца файла к объекту, который они контролируют; т.е. (yourTableView -> tableView) или yourCustomHeaderView -> настроенное вами представление) и (yourImage -> настраиваемый UIImageView, который вы поместили в свое настраиваемое представление.

Теперь, когда соединения установлены, у вас есть «ПОЛНЫЙ» контроль над аспектом каждого элемента, задав любое свойство этого элемента, например self.yourCustomHeaderView.background = [UIColor redColor] и т. д.

** Убедитесь, что вы перетащили из TableView в «File's Owner», чтобы установить (делегат) и (источник данных) таблицы обратно владельцу файла; где находятся все ваши методы делегата tableView!


Это самый простой из шагов, вы можете сделать представление настолько сложным, насколько вам нужно, одно из моих представлений viewForHeaderInSection: view имеет 40+ IBoutets для всех представлений, которые включают кнопки, изображения, ярлыки, другие представления и т. Д. ...


На самом деле пытался сохранить весь код в «блоках кода», ничего не вышло, но вы все равно можете его прочитать.
1
ответ дан 2 September 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: