Подтвердить что ты не робот

Как я могу перерабатывать объекты UITableViewCell, созданные из XIB?

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

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

4b9b3361

Ответ 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 файлов.