Определите разные ячейки для iPhone и iPad в tableView: cellForRowAtIndexPath:

Я просто пытаюсь создать приложение для iPhone и iPad. Для этого я создал табличное представление, которое создает ячейки, ожидающие json, который будет получен при загрузке приложения. Внутри метода

tableView:cellForRowAtIndexPath:

Я инициирую ячейку, которая будет использоваться для iPhone, и устанавливаю конкретные значения из json. Я использую ячейку - это пользовательская ячейка, созданная с новым объектом и NIB-файлом. Код выглядит так:

static NSString *CellIdentifier = @"tvChannelIdentifier";

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

if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"tvChannelCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
....

Теперь, когда я пытаюсь заставить приложение работать и на iPad, я создал новую настраиваемую ячейку, также с новым объектом и NIB-файлом. Имена переменных такие же, как в customIPhoneCell, поэтому мне не нужно менять весь код. Я просто вставил переключатель в tableView: cellForRowAtIndexPath:, чтобы показать правильную ячейку, но к ней нельзя получить доступ с помощью кода:

static NSString *CellIdentifier = @"tvChannelCell";
static NSString *IPadCellIdentifier = @"tvChannelIPadCell";


//determination which device ---> choose cell
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    tvChannelCell *cell = (tvChannelCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

}else{

    tvChannelIPadCell = (tvChannelIPadCell *) [tableView dequeueReusableCellWithIdentifier:IPadCellIdentifier];
}

Я попытался определить объекты ячеек в верхней части класса, но тогда я не могу использовать то же имя переменной. Я также попытался выбрать файл NIB на iPad, чтобы проверить, будет ли он отображаться, но ничего не происходит. И я попытался установить UITableviewcell вверху,

UITableViewCell *cell

и установите конкретный тип ячейки внутри моего переключателя в cellForRowAtIndexPath, но тогда переменные не будут доступны.

Итак, мой вопрос: можно ли сделать этот переключатель внутри метода tableview или мне нужно кодировать несколько частей для каждого устройства, где каждый тип ячейки имеет собственное имя переменной?


person Alex Cio    schedule 19.04.2013    source источник


Ответы (3)


Что я делаю:

Я создаю только один подкласс UITableViewCell с 2 xib, один xib для iPad, а другой для iPhone.

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

if (cell == nil) {
NSArray *nib;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){

     nib = [[NSBundle mainBundle] loadNibNamed:@"tvChannelCell_iPhone" owner:self options:nil];

}else{

    nib = [[NSBundle mainBundle] loadNibNamed:@"tvChannelCell_iPad" owner:self options:nil];
}

    cell = [nib objectAtIndex:0];
}
person jcesarmobile    schedule 19.04.2013
comment
Спасибо. Теперь я подключил iPad-NIB к тому же объекту, что и iPhone-NIB. - person Alex Cio; 19.04.2013
comment
@xandruCea: Хорошо, что ваша проблема решена, но вы всегда должны учитывать или принимать ответы (если они совпадают), ответ, на который был дан первый ответ .. - person P.J; 19.04.2013
comment
@jcesar: ваше право, но ваш ответ содержал инициализацию объекта ячейки в первой строке, что помогло мне соединить оба NIB-файла с одним объектом, так что ваш 'помог мне больше всего - person Alex Cio; 19.04.2013

эта строка кода полезна для различения iphone и ipad,

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        tvChannelCell *cell = (tvChannelCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    }else{

        cell = (tvChannelIPadCell *) [tableView dequeueReusableCellWithIdentifier:IPadCellIdentifier];

     }
person Balu    schedule 19.04.2013

Это довольно просто, почему бы вам не создать еще один наконечник для iPad и просто получить к нему доступ, когда устройством является iPad.

У вас весь код останется прежним, т.е. вам не нужно сравнивать iPad как нигде

Нравится:

if (cell == nil) {
    NSArray *nib;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
     nib = [[NSBundle mainBundle] loadNibNamed:@"tvChannelCell-iPad" owner:self options:nil];}
    else{
    nib = [[NSBundle mainBundle] loadNibNamed:@"tvChannelCell" owner:self options:nil];}
    cell = [nib objectAtIndex:0];
}
person P.J    schedule 19.04.2013