Как создать UITableView sectionHeader представлений в Интерфейсном Разработчике для iPhone? - PullRequest
1 голос
/ 20 июля 2010

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

Для этого я создал новый подкласс 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 -> когда я пытаюсь настроить пользовательские значения, представление по-прежнему равно нулю), но я нене знаю, как это исправить.

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

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

Ответы [ 3 ]

1 голос
/ 30 июля 2010

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

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

Я также обнаружил, что XCode легко выдвигает«закодированное» пользовательское представление из метода viewForHeaderInSection: с той же самой слабой ссылкой, но с использованием IB, связь должна быть более точной.Требуется немного больше работы, но предлагает гораздо лучший опыт, как только вы приступите к созданию гораздо более сложных объектов.

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

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

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

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


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

    @interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> {
    
  2. Создайте все IBOutlets, которые будут на вашем взгляде:

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

        @property(nonatomic,retain) IBOutlet UITableView *yourTableView;    
        @property(nonatomic,retain) IBOutlet UIImageView *yourCustomHeaderView;
        @property(nonatomic,retain) IBOutlet UIImageView *yourImageOnCustomView;
    

(. М)


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

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

    -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    
        //Intialize the header View to present:
        UIView *headerView;
    
        //Display Section Headers for rows:
        if (section == 0) {headerStatBar = self.yourCustomSectionHeaderView1;}
        if (section == 1) {headerView = self.yourCustomSectionHeaderView1;} 
        if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
    
        //Return the view to the Table:
        return headerView;
    }
    
  3. Сделайте все ваши соединения вIB, самый простой способ:

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

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

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


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


Действительно пытались сохранитьвесь код в «блоках кода» просто не сработает, но вы все равно можете его прочитать.
1 голос
/ 27 февраля 2012

Ваш вид еще не загружен.Вот почему это ноль.Сделайте ваш код модификации в ViewDidLoad.

У меня была похожая проблема, когда я пытался редактировать значения меток после того, как я инициализировал заголовок, но я, но метки были нулевыми.Я решил проблему, вызвав код модификации метки из метода viewDidLoad контроллера представления заголовка.

0 голосов
/ 21 июля 2010

Мне пришлось добавить свойство NSString в мой контроллер вида в разрезе. В viewDidLoad я присвоил эту строку текстовому свойству UILabel, теперь она работает.

...