проблема с UITableViewCell при настройке с помощью расширенного класса
-
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
параметр, и он должен работать нормально.