Назначение выхода для UITableViewCell с использованием UINib - PullRequest
0 голосов
/ 02 февраля 2012

Я просмотрел TableViewUpdates / TVAnimationGestures из кода Apple WWDC 2010, и у меня возникли проблемы с дублированием подкласса UITableViewCell.Вот что я сделал:

Я создал новый подкласс UITableViewCell с некоторыми простыми свойствами:

@interface TargetDetailTableViewCell : UITableViewCell

@property (nonatomic, retain) IBOutlet UILabel *DescriptionLabel;
@property (nonatomic, retain) IBOutlet UILabel *ValueLabel;
@property (nonatomic, retain) IBOutlet UIImageView *DotImageView;

В .m я просто освобождаю память.В IB я изменяю свой класс на TargetDetailTableViewCell для UITableViewCell, который я только что перетащил в IB.Я подключаю розетки из TargetDetailTableViewCell к соответствующим меткам и представлению изображения.

В классе я хочу использовать это:

@class TargetDetailTableViewCell;

//some properties
@property (nonatomic, assign) IBOutlet TargetDetailTableViewCell *TargetCell;

В .m:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    static NSString *TargetCellIdentifier = @"TargetDetailTableViewCellIdentifier";
    TargetDetailTableViewCell *cell = (TargetDetailTableViewCell *)[tableView dequeueReusableCellWithIdentifier:TargetCellIdentifier];

    if (cell == nil) {
        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;
    }
// set some labels
return cell;
}

При запуске я получаю сообщение об ошибке: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Единственное, что я могу увидеть, это различие между примером Apple и моим, состоит в том, что когда я нажимаю ctlr-щелчок по подклассу UITableViewCell в их IB, у них устанавливается свойство File's Owner.Я понятия не имею, как они подключили эту розетку, поскольку она объявлена ​​как свойство в классе, в котором они используют ячейку, но не существует физического соединения IB, которое они устанавливают.Может кто-нибудь объяснить это мне или что я делаю неправильно?

Кроме того, если кто-то может объяснить это, было бы здорово:

        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;

Кажется, что вы создаете перо ивладельцем пера, который создается из памяти, является класс, в котором вы находитесь или сам (мой viewcontroller).Тогда последние две строки меня смущают.Это как если бы вы указали своей ячейке указывать на вновь созданный объект, а затем устанавливаете для вновь созданного объекта значение nil.Что в моей голове, я думаю, клетка теперь также указывает на ноль.Спасибо.

1 Ответ

2 голосов
/ 02 февраля 2012

У вас должен быть владелец в вашем настраиваемом кончике ячейки представления таблицы, и этот владелец должен быть вашим классом TableViewDataSource (то есть контроллером представления таблицы, который реализует метод cellForRowAtIndexPath и имеет выход TargetCell для ячейки таблицы).

Вам также необходимо подключить этот выход TargetCell от владельца файла (TableViewController) к пользовательскому представлению таблицы.

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

Затем вы копируете эту ссылку в переменную метода ячейки, настраиваете ее и возвращаете. Вы назначаете этому свойству значение nil после копирования, потому что оно понадобилось только в качестве начальной загрузки, чтобы получить ссылку на объект в nib для использования в методе cellForRowAtIndexPath.

...