Как инициализировать пользовательскую ячейку таблицы стилей прототипа в iOS 5 раскадровки?
Я перехожу на iOS 5 и раскадровки. Когда у меня есть представление таблицы со стилем ячейки по умолчанию, все работает нормально.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifierFromStoryboard"];
}
return cell;
}
Я видел примеры, когда блок "if (cell == nil)" удален. Однако, если я его вытащу, приложение отключится с сообщением: "UITableView dataSource должен вернуть ячейку из tableView: cellForRowAtIndexPath:". Это не проблема, потому что она работает, как показано выше.
Моя проблема в том, что я хочу использовать пользовательский стиль для ячейки и, следовательно, не могу использовать initWithStyle. Как инициализировать пользовательскую ячейку, которую я создал на раскадровке?
У старого приложения pre-5 был nib и класс, который использовал что-то вроде этого, но теперь я использую раскадровку.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomTableCell *cell = (MyCustomTableCell *) [tableView dequeueReusableCellWithIdentifier:@"MyCustomIdentifier"];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" owner:self options:nil];
cell = (MyCustomTableCell *) [nib objectAtIndex:0];
}
return cell;
}
Ответы
Ответ 1
Этот путь
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return cell;
}
Ответ 2
Это работало идеально для меня (Xcode 4.5.2 и iOS 6.0):
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if( cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
UILabel *title = (UILabel*) [cell viewWithTag:1000];
UILabel *summary = (UILabel*) [cell viewWithTag:1001];
[title setText:[ tableMainTitle objectAtIndex:indexPath.row]];
[summary setText:[ tableSubTitle objectAtIndex:indexPath.row]];
return cell;
}
Важно: Не забудьте установить делегат и источник данных.
Ответ 3
Если вы загрузите контроллер вида, содержащий табличное представление, используя:
MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
Затем внутри cellForRowAtIndexPath
вам просто нужна одна строка:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];
dequeueReusableCellWithIdentifier
будет создавать экземпляр одной ячейки, если ее не существует.
Ответ 4
Я думаю, что это работает очень хорошо. Я пытался что-то придумать, и спасибо, что это сработало. Ну, я делал это, пытаясь выделить ячейку, которую я выделял, используя общий класс ячеек вместо того, который я создал
поэтому я делал это, поэтому причина, по которой это не сработало
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
поэтому вместо UITableViewCell присвойте ячейке свой класс, ну с приведенным выше примером "CustomCell"
Еще раз спасибо
Ответ 5
static NSString *[email protected]"SearchUser";
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell==nil)
{
cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;