Используйте несколько классов ячеек в tableViewController - PullRequest
1 голос
/ 31 августа 2010

Есть ли способ использовать несколько классов uitableviewcell с nib-файлами в tableViewController?

Это отличное видео-руководство по созданию пользовательских классов ячеек для использования в tableViewController в функции cellForRowAtIndexPath, которую я 'вставьте сюда на тот случай, если кто-то захочет увидеть.

В этом примере они используют только один тип многократно используемого класса ячеек.Это из моего собственного проекта, но по сути это то, что представляет учебник.«videoCellEntry» - это пользовательская ячейка, которую я создал с помощью nib-файла videoEntryCell.xib, «videoEntry» - это класс для каждой настраиваемой ячейки, а «videos» - это массив videoEntry.

I 'Предполагая использование нескольких nib-файлов, я могу поставить некоторые условия, чтобы выбрать, какой nib-файл я хочу, и затем вызвать другую loadNibNamed: часть, например, так:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"videoCellId";

    videoEntryCell *cell = 
  (videoEntryCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        if(<condition 1>) {
          NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell" owner:self options:nil];
        }
        if(<condition 2>) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell2" owner:self options:nil];
        }
 cell = (videoEntryCell *)[nib objectAtIndex:0];
    }

 // Configure the cell.
 videoEntry *vid = [videos objectAtIndex:indexPath.row];
 [cell configureForVideoEntry:vid];

    return cell;
}

Но может ли tableViewController обрабатывать файлы nib с несколькими ячейками?Или есть лучший способ?И не будет ли каждая ячейка требовать различного CellIdentifier в зависимости от ее nib-файла?

1 Ответ

1 голос
/ 31 августа 2010

Да, вы можете использовать несколько Nib-файлов и несколько CellIdentifiers в TableViewController. Просто поместите ваше условие перед CellIdentifier. Я так и сделал.

Некоторые примеры из таблицы - (UITableViewCell *): (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) метод indexPath:

Сначала определите переменную ячейку:

UITableViewCell *cell;

Теперь блок if:

if(<condition 1>) {
    static NSString *CellIdentifier = @"VideoCell1";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell" owner:nil options:nil];
        for (id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (UITableViewCell *) currentObject;
                break;
            }
        }
    }
    // customize your cell here
}

if(<condition 2>) {
    static NSString *CellIdentifier = @"VideoCell2";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"videoEntryCell2" owner:nil options:nil];
        for (id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (UITableViewCell *) currentObject;
                break;
            }
        }
    }
    // customize your cell here
}

и наконец:

return cell;

Вы можете повторять блок if столько раз, сколько захотите. Важно только, чтобы вы вернули ячейку, которая не ноль.

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