Подтвердить что ты не робот

Как инициализировать пользовательскую ячейку таблицы стилей прототипа в 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;
}
4b9b3361

Ответ 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;