it-swarm.com.ru

Как инициализировать пользовательскую ячейку таблицы прототипов в раскадровках 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. Как инициализировать пользовательскую ячейку, созданную на раскадровке?

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

- (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;
}
36
Tom Kincaid

Сюда

- (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;
}
39
Alex

Это прекрасно сработало для меня (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;
}

Важно: не забудьте установить делегат и источник данных. 

9
OSXMonk

Если вы загружаете свой контроллер представления, который содержит представление таблицы, используя:

MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

Тогда внутри cellForRowAtIndexPath вам просто нужна одна строка:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];

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

8
jemeshsu

Я думаю, что этот работает очень хорошо. Я пытался обдумать это некоторое время, и спасибо, что это сработало ... хорошо, я делал это, когда пытался выделить ячейку, которую я выделял, используя общий класс ячейки вместо того, который я создал

так я делал это, так вот почему это не сработало

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

поэтому вместо UITableViewCell выделите ячейку с вашим классом, хорошо с приведенным выше примером "CustomCell"

Еще раз спасибо

0
fftoolbar
static NSString *[email protected]"SearchUser";
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell==nil)
{
    cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;
0
Anand