Как я могу перерабатывать объекты UITableViewCell, созданные из XIB?
Я хотел бы создать пользовательский UITableViewCell с помощью XIB, но я не уверен, как его перерабатывать с помощью механизма ожидания UITableViewController. Как я могу это сделать?
Люди, этот вопрос должен был отвечать на себя как FAQ, хотя мне нравятся удивительные ответы. Возьмите несколько яиц, побалуйте себя пивом. Я спросил об этом, потому что друг спросил меня, и я хотел бы поставить его на StackOverflow. Если у вас есть что-нибудь, чтобы внести свой вклад, обязательно!
Ответы
Ответ 1
Если вы используете iOS 5, вы можете использовать
[self.tableView registerNib:[UINib nibWithNibName:@"nibname"
bundle:nil]
forCellReuseIdentifier:@"cellIdentifier"];
Затем, когда вы вызываете:
cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
tableview будет либо загружать nib, либо давать вам ячейку, либо деактивировать ячейку для вас!
Наконечник должен быть только нитью с одной таблицей, определенной внутри нее!
Ответ 2
Создайте пустой нить и добавьте ячейку таблицы в качестве первого элемента. В инспекторе вы можете добавить строку reuseIdentifier в Interface Builder.
Чтобы использовать ячейку в коде, сделайте следующее:
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (cell == nil)
{
cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0];
}
//set up cell
return cell;
}
Существует еще один метод, когда вы создаете розетку для своей ячейки и загружаете ящик ячейки, используя контроллер в качестве владельца файла, но, честно говоря, это намного проще.
Если вы хотите иметь доступ к подзонам, которые вы добавили в ячейку в nib, дайте им уникальные теги и получите доступ к ним с помощью [cell viewWithTag: x];
Если вы хотите установить пользовательские свойства в ячейке, вам нужно создать пользовательский подкласс UITableViewCell, а затем просто установить это как класс вашего nib в InterfaceBuilder и передать UITableViewCell в свой собственный подкласс, когда вы удалите его в код выше.
Ответ 3
Чтобы настроить пользовательский UITableViewCell с помощью XIB, вам нужно сделать несколько вещей:
- Настройка IBOutlet в заголовке
- Конфигурирование ячейки представления таблицы в построителе интерфейсов
- Загрузите XIB внутри
tableView:cellForRowAtIndexPath:
- Настроить его как любую другую ячейку
Итак... Позвольте настроить IBOutlet в файле заголовка.
@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell;
Не забудьте синтезировать его внутри файла реализации.
@synthesize dvarTorahCell;
Теперь создайте и настройте ячейку. Вы хотите обратить внимание на идентификатор ячейки и IBOutlet, как показано ниже:
![enter image description here]()
Теперь в коде вы загружаете XIB в свою ячейку, как показано ниже:
![enter image description here]()
Обратите внимание, что Идентификатор ячейки в построителе интерфейса совпадает с показанным в коде ниже.
Затем вы идете вперед и настраиваете свою ячейку, как и любой другой.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil];
cell = dvarTorahCell;
dvarTorahCell = nil;
}
//configure your cell here.
Просто обратите внимание, что при доступе к subviews, например меток, вам теперь нужно ссылаться на них по тегу, а не по именам свойств, например textLabel
и detailTextLabel
.
Ответ 4
Здесь вы можете:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
if (!cell)
{
NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
cell = [topLevelItems objectAtIndex:0];
}
return cell;
}
Где cellLoader
в .h определяется следующим образом:
UINib *cellLoader;
и в .m определяется следующим образом (например, во время инициализации):
cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain];
и CellClassName
определяется в .m следующим образом (также является именем вашего xib).
static NSString *CellClassName = @"YourCustomeCell";
Не забудьте использовать строку CellClassName
также в вашей ячейке, созданной xib.
Для получения дополнительной информации я предлагаю вам прочитать этот фантастический учебник creating-a-custom-uitableviewcell-in-ios-4.
Надеюсь, что это поможет.
P.S. Я предлагаю вам использовать UINib
, потому что это оптимизированный метод загрузки xib файлов.