Как я могу утилизировать объекты UITableViewCell, созданные из XIB? - PullRequest
18 голосов
/ 05 февраля 2012

Я бы хотел создать пользовательский UITableViewCell, используя XIB, но я не уверен, как его переработать, используя механизм очередей UITableViewController.Как я могу это сделать?

Люди, этот вопрос был задан для самостоятельного ответа согласно FAQ , хотя мне нравятся удивительные ответы.Возьми несколько голосов, побалуй себя пивом.Я спросил об этом, потому что друг спросил меня, и я хотел поставить его на StackOverflow.Если у вас есть что внести, во что бы то ни стало!

Ответы [ 4 ]

51 голосов
/ 05 февраля 2012

Если вы используете iOS 5, вы можете использовать

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
                                           bundle:nil] 
     forCellReuseIdentifier:@"cellIdentifier"];

Тогда всякий раз, когда вы звоните:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

просмотр таблицы либо загрузит перо и даст вам ячейку, либо освободит ячейку для вас!

Перо должно быть только пером, внутри которого определена одна ячейка таблицы!

2 голосов
/ 05 февраля 2012

Чтобы настроить пользовательский 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.

Просто обратите внимание, что при доступе к подпредставлениям, таким как метки, теперь вам нужно ссылаться на них по тегам, а не по именам свойств, таким как textLabel и detailTextLabel.

2 голосов
/ 05 февраля 2012

Создайте пустой перо и добавьте ячейку таблицы в качестве первого элемента. В инспекторе вы можете добавить строку reuseIdentifier в Интерфейсном Разработчике.

Чтобы использовать ячейку в вашем коде, сделайте следующее:

- (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;
}

Существует еще один метод, в котором вы создаете розетку для своей ячейки и загружаете перо ячейки, используя контроллер в качестве владельца файла, но, честно говоря, это намного проще.

Если вы хотите иметь доступ к подпредставлениям, добавленным в ячейку в перо, присвойте им уникальные теги и получите к ним доступ с помощью [cell viewWithTag: x];

Если вы хотите иметь возможность устанавливать пользовательские свойства в ячейке, вам нужно создать пользовательский подкласс UITableViewCell, а затем просто установить его как класс вашего пера в InterfaceBuilder и привести UITableViewCell к своему пользовательскому подклассу удалите его из кода выше.

1 голос
/ 05 февраля 2012

Вот как это можно сделать:

- (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.

Для получения дополнительной информации, я предлагаю вам прочитать этот фантастический урок Создание-настраиваемого--------------ль -уитив-ю-вид-я-4-х * 4

Надеюсь, это поможет.

P.S. Я предлагаю вам использовать UINib, потому что это оптимизированный способ загрузки файлов XIB.

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