проблема с UITableViewCell при настройке с помощью расширенного класса

StackOverflow https://stackoverflow.com/questions/7395031

  •  29-10-2019
  •  | 
  •  

Вопрос

У меня есть 2 класса для UITableViewCell, которые показывают разные данные, но используют одну и ту же таблицу.

Я пытаюсь заполнить таблицу в два этапа, используя переменную bool, но кажется, что я получаю исключение, потому что ячейка получает первое назначение класса и не может мутировать...

в основном мне нужно посещать расширенные занятия

@interface PatientsCellNewPager : UITableViewCell { } 
@interface DoctorsCellNewPager : UITableViewCell { } 

код тормозит, когда я на шаге 2 пытаюсь изменить тип ячейки и выдает исключение на [cell setData:set cellid:[NSString stringWithFormat:@"%d",indexPath.row] ];на фазе==2 если блок..

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

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

вот мой код

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";



    if (phase==2) { //patient


        PatientsCellNewPager *cell =(PatientsCellNewPager *)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[PatientsCellNewPager alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }







        PatientsSet *set = (PatientsSet *)[patients_set objectAtIndex:indexPath.row];       

        NSLog(@"logg %d",indexPath.row);    


        [cell setData:set cellid:[NSString stringWithFormat:@"%d",indexPath.row] ]; 




           return cell;

    }
    else if (phase==1) { //doctor


        DoctorsCellNewPager *cell =(DoctorsCellNewPager *)  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[DoctorsCellNewPager alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        }





            // Set up the cell

            DoctorsSet *set = (DoctorsSet *)[doctors_set objectAtIndex:indexPath.row];      


              [cell setData:set cellid:[NSString stringWithFormat:@"%d",indexPath.row] pass:YES ];  





        return cell;


    }


    return nil;

}

вот моя ошибка

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DoctorsCellNewPager setData:cellid:]: unrecognized selector sent to instance 0x181690'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x323ef64f __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x36632c5d objc_exception_throw + 24
    2   CoreFoundation                      0x323f31bf -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
    3   CoreFoundation                      0x323f2649 ___forwarding___ + 508
Это было полезно?

Решение

Это очень распространенная проблема, и многие люди наткнулись на это - совсем недавно я должен был иметь дело с этим вопросом тоже.

Мэтт Галлахер опубликовал отличный учебник о том, как выполнить это в своем блоге:

Гетерогенные клетки в UiableViewController / strong>


Ну, я только что получил представление о том, как она могла работать .. // Это очень экспериментально и не было проверено :

static NSString *PatientsCellIdentifier = @"PatientsCellNewPager";
static NSString *DoctorsCellIdentifier = @"DoctorsCellNewPager";

UITableViewCell *cell;
if(patient) {
    cell = [tableView dequeueReusableCellWithIdentifier:PatientsCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
        initWithStyle:UITableViewCellStyleDefault 
        reuseIdentifier:PatientsCellIdentifier] autorelease];
    }
    // Setup cell for patient -> maybe you could use -configureCell:atIndexPath:
} else if (doctor) {
    cell = [tableView dequeueReusableCellWithIdentifier:DoctorsCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
        initWithStyle:UITableViewCellStyleDefault 
        reuseIdentifier:DoctorsCellIdentifier] autorelease];
    }
    // Setup cell for doctor -> maybe you could use -configureCell:atIndexPath:
}

return cell;
.

Дайте мне знать, если это принесет вас дальше ..

HTH

Другие советы

Вы пропустили pass:.. параметр в конце и метод, который вы вызываете, [DoctorsCellNewPager setData:celled:], не имеет параметра pass набор.Так что добавьте pass параметр, и он должен работать нормально.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top