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

DequeueReusableCellWithIdentifier никогда не возвращает nil

Я использую пользовательский UITableViewCell в своем UITableView, но проблема в том, что ячейка никогда не будет равна нулю при вызове dequeueReusableCellWithIdentifier. Почему это?

- (void)viewDidLoad
{
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"PHResultTableViewCell" bundle: nil];
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    PHResultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
    if (cell == nil)
    {
        PackageHolidayItem *obj=[[PackageHolidayItem alloc]init];
        obj= [totalArray objectAtIndex:indexPath.row];
        cell.packageHolidayItem = obj;
        [cell loadRow];

    }
    return cell;
}    
4b9b3361

Ответ 1

Начиная с iOS 5, когда вы используете раскадровки, и ваш идентификатор повторного использования соответствует прототипу в вашем раскадровке, вы не получите нуль, возвращенный из dequeueReusableCellWithIdentifier.

От Apple Doc:

Руководство по программированию таблиц для iOS

Создание и настройка вида таблицы

     
  

Заполнение динамической таблицы с данными

         

Если метод dequeueReusableCellWithIdentifier: запрашивает ячейку     которые определены в раскадровке, метод всегда возвращает действительный     клетка. Если нет повторно использованной ячейки, ожидающей повторного использования, метод     создает новую, используя информацию в самой раскадровки. Эта     исключает необходимость проверки возвращаемого значения для nil и создания     ячейки вручную.

  

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

NSLog(@"Deque Cell %p", cell);

Лучше всего использовать точку останова для ее регистрации.

enter image description here

$25 = 0x097f9850 <DDSImageSubtitleCheckedTableViewCell: 0x97f9850; baseClass = UITableViewCell; frame = (0 22; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x97f9740>>
$26 = 0x0a6a4a00 <DDSImageSubtitleCheckedTableViewCell: 0xa6a4a00; baseClass = UITableViewCell; frame = (0 66; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa6a4b50>>
$27 = 0x0a3ad250 <DDSImageSubtitleCheckedTableViewCell: 0xa3ad250; baseClass = UITableViewCell; frame = (0 110; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ad390>>
$28 = 0x0a3ae640 <DDSImageSubtitleCheckedTableViewCell: 0xa3ae640; baseClass = UITableViewCell; frame = (0 176; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0xa3ae780>>
$29 = 0x0972a370 <DDSImageSubtitleCheckedTableViewCell: 0x972a370; baseClass = UITableViewCell; frame = (0 220; 320 44); hidden = YES; autoresize = W; layer = <CALayer: 0x972a340>>

Если вам просто нужны адреса

enter image description here

0x097f9850
0x0a6a4a00
0x0a3ad250
0x0a3ae640
0x0972a370

Ответ 2

Он не возвращает ноль, потому что вы зарегистрировали наконечник для повторного использования ячеек ([[self tableView] registerNib:nib forCellReuseIdentifier:@"MyCell"];).

если dequeueReusableCellWithIdentifier: не может найти ячейку в очереди повторного использования tableviews, она создаст новый экземпляр из указанного вами символа.

Ответ 3

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

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath{

        PHResultTableViewCell *cell = (PHResultTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MyCell" 
                                                                                               forIndexPath:indexPath];];

        cell.packageHolidayItem = totalArray[indexPath.row];;
        [cell loadRow];

        return cell;
    }    

Ответ 4

Я не верю, что он должен вернуть нуль. Зачем вам это нужно?

Метод dequeueReusableCellWithIdentifier возвращает ячейку, которая будет отображаться, поэтому она действительно хороша, что она не является нулевой - таким образом вы можете ее модифицировать по мере необходимости.