Поместите UIView в заголовок UITableView - PullRequest
7 голосов
/ 11 февраля 2011

У меня есть UITableView, который находится в моем XIB-файле.И я создал такое свойство для контроллера:

@property (nonatomic, retain) IBOutlet UITableView *myTableView;

Теперь я хочу иметь заголовок табличного представления (не заголовок для каждого раздела).Итак, поскольку я хочу иметь собственный стиль, я создал новый xib-файл с представлением (и я подключился к своему контроллеру, в котором реализован myTableView).

Затем я могу написать в viewDidLoad вмой контроллер:

[self.myTableView setTableHeaderView:self.myTableHeaderView];

, где myTableViewHeader - это свойство UIView в контроллере.

К сожалению, UITableView не отображает этот UIView, поэтому мой вопрос, как я могу поставитьUIView для UITableView в заголовок?

Заранее спасибо и наилучшими пожеланиями.

1 Ответ

24 голосов
/ 11 февраля 2011

Несколько вещей для проверки:

  • myTableHeaderView также должен быть IBOutlet или создан где-то в коде в вашем классе

  • self.myTableHeaderView не должно быть равно нулю, когда вы пытаетесь добавить его в качестве представления заголовка таблицы. Если это ноль, значит, вы неправильно подключили свои розетки

  • если вы разработали заголовок табличного представления в IB в своем собственном файле .xib, то вы должны где-то вызвать это (viewDidLoad - хорошее место):

[[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];

Владелец файла MyTableViewHeader.xib должен быть вашим подклассом TableViewController, и вы должны подключить объект myTableHeaderView к соответствующему выходу владельца файла.

РЕДАКТИРОВАТЬ: в ответ на "что делает [[NSBundle mainBundle] loadNibNamed:@"MyTableViewHeader" owner:self options:nil];" делать?

Эта маленькая строчка содержит магию, которая откроет вам глаза на то, как файлы XIB и объекты Objective-C работают вместе в Какао (касание), поднимая кунг-фу программирования на iOS на совершенно новый уровень. Есть два класса программистов Какао: те, кто понимает, что он делает, использует и извлекает из этого пользу, и те, кто еще не знает, чего им не хватает, и вместо этого натыкается на пустыню, пытаясь создать файлы XIB для своих объектов и никогда не заставить его работать.

С этим огромным наращиванием вот детали:

Файл XIB (NIB) - это коллекция заархивированных объектов Objective-C (и ссылок на объекты, которые на самом деле не находятся внутри XIB, такие как «Владелец файла», так называемый «прокси-объект») и связей между этими объектами. Когда файл XIB загружен, эти заархивированные объекты возвращаются к жизни именно в том состоянии, в котором они были сохранены в XIB, , а затем соединения между этими живыми объектами (и "прокси-объектами") выполняются в соответствии с соединения, записанные в файле XIB.

Например, в вашем стандартном файле .xib подкласса UIViewController у вас в качестве владельца файла установлен класс MyViewController. Внутри .xib находится объект UIView, который обычно сам содержит другие объекты UIKit. Выход "view" класса UIViewController указывает на объект UIView в .xib. Когда этот файл .xib загружен, объект UIView разархивируется и становится живым объектом UIView со всеми свойствами и настройками, записанными в .xib. Это «разархивирующая часть».

А затем , из-за подключения в .xib от владельца файла (класс MyViewController) к объекту UIView, указатель на этот новый объект UIView сохраняется в поле «вид» вашего MyViewController пример. Любые другие соединения, также присутствующие в файле .xib, такие как UILabels, действия UIButton и т. Д., Также настраиваются для любых других полей «IBOutlet» в MyViewController.

Все это похоже на магию и происходит с

(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle

метод при запуске нового подкласса UIViewController.

Теперь самое интересное: вы сами можете связать файлы пера с объектами! Вы можете использовать метод loadNibNamed:owner:options, чтобы связать любой файл .xib с соответствующим набором nO IBOutlets в любом объекте, который вы хотите !!!

Внезапно, создавая полностью настраиваемые ячейки табличного представления, верхние и нижние колонтитулы таблицы, что угодно, вы легко можете написать модульные многократно используемые компоненты UIView и т. Д., Все это выложено в Interface Builder.

Объект, ноль IBOutlets которого вы хотите заполнить объектами, загруженными из файла .xib, является объектом "owner". Обычно (но я не уверен, что это абсолютно необходимо, любой класс с идентично типизированным и именованным IBOutlets, установленным в значение Владелец файла, может работать), этот класс будет указан как «Владелец файла» в сиб.

ОК, теперь у вас есть существующий объект-владелец с nil IBOutlets (IBOutlets должен быть nil, иначе они не будут изменены, это «правило» загрузки XIB в объект-владелец. Хорошо, что некоторые IBOutlets не ноль, они просто не будут изменены при загрузке файла XIB, и обычно это то, что вы хотите), и у вас есть файл .xib с объектами, которые вы хотите загрузить в объект владельца. Звоните:

[[NSBundle mainBundle] loadNibNamed:@"MyXIBFileToLoad" owner:theOwner options:nil];

.. и вуаля! Теперь все nil IBOutlets в "theOwner", которые связаны с объектами в MyXIBFileToLoad.xib, были установлены на новые объекты, загруженные из файла XIB.

(также этот метод возвращает массив всех объектов, разархивированных из xib. Если вам не нужна настройка каких-либо выходов владельца, вы можете просто найти в этом списке ваши объекты по классу и по тегу).

Вот и все, теперь сходите с ума от новых способов связать классы Objective-C с объектами, хранящимися в файлах XIB!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...