Как правильно отображать различные подклассы UITableViewCell в одном и том же UITableView?Как использовать два разных пользовательских подкласса UITableViewCell в одной таблице?
Я использую раскадровку для этого вопроса. Я пытаюсь использовать два разных подкласса ячейки UITableView в одной таблице. Идея, что TTTextFieldCell
s умеет показывать текстовое поле и TTPickerCell
s знает, как представить UIPicker пользователю. Там протокол TTTableViewCell
определяет один селектор: [setCellDetails (NSDictionary*) cellDetails]
Каждый подкласс UITableViewCell
знает, что делать с помощью словаря CellDetails для настройки ячейки.
-(NSArray *)tableData {
if (!_tableData) {
_tableData =
@[ // Sections
@{ // Section Details
kSectionName:@"Scout Information"
,kRows:@[ // Rows
@{// Cell Details
kBoundProperty:self.scoutName
,kReuseIdentifier:kTextFieldCell
,kLabel:@"Name"
,kPlaceholderValue:@"Scout's Name"
}
,@{
kReuseIdentifier:@"TTPickerCell"
,kLabel:@"Type"
,kPlaceholderValue:@"Cadet, Junior, etc..."
}
,@{
kBoundProperty:self.yearsScouting
,kReuseIdentifier:kTextFieldCell
,kLabel:@"Years"
,kPlaceholderValue:@"Years of Experience"
,kKeyboardStyle:@(UIKeyboardTypeNumberPad)
}
]
}
,@{ // Section Details
kSectionName:@"Parent Information"
,kRows:@[
@{
kBoundProperty:self.parentName
,kReuseIdentifier:kTextFieldCell
,kLabel:@"Name"
,kPlaceholderValue:@"Parents's Name"
}
]
}
];
}
return _tableData;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// Line A
[self.tableView registerClass:[TTTextFieldCell class] forCellReuseIdentifier:@"TTTextFieldCell"];
// Line B
[self.tableView registerClass:[TTPickerCell class] forCellReuseIdentifier:@"TTPickerCell"];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary* cellDetails = self.tableData[indexPath.section][kRows][indexPath.row];
NSString* reuseIdentifier = cellDetails[kReuseIdentifier];
// Line C
UITableViewCell<TTTableViewCell> *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
[cell setCellDetails:cellDetails];
return cell;
}
Теперь, вот вопрос. Если я прокомментирую строки A и B, то TTTextFieldCells отображаются правильно. Но строка C завершится неудачно, потому что она пытается вызвать инициализацию TTTextFieldCell с помощью объекта TTPickerCell и не работает, поскольку объект TTPickerCell не имеет одинаковых свойств. Если я раскомментирую строки A и B, то стили ячейки по умолчанию равны UITableViewCellStyleDefault
, и они не отображают пользовательские элементы управления. Как ни странно, если я прокомментирую Line A и раскомментирую строку B, то TTTextFieldCells
выглядит великолепно, но TTPickerCells
по умолчанию - UITableViewCellStyleDefault
.
Похоже, что если я не зарегистрирую класс, dequeue вернет экземпляр первого класса ячеек прототипа. Если я зарегистрирую класс, ячейка по умолчанию будет равна UITableViewCellStyleDefault
.
Также обратите внимание, что initWithStyle: reuseIdentifier: селекторы вызываются только при регистрации класса.
Итак, как правильно отображать различные подклассы UITableViewCell в одном и том же UITableView? Должен ли я отказаться от использования раскадровки для создания ячейки?
Заранее спасибо.
спасибо @Alex. Стоит отметить, что это не изменило выраженного поведения. :(Но имеет смысл зарегистрироваться в методе viewDidLoad. Спасибо за подсказку! –