У меня есть что-то странное в использовании UINib, хотя я подозреваю, что настоящая проблема может быть похоронена в другом месте.Странная проблема с использованием UINib/pointer going AWOL
Мое приложение использует табличное представление, содержимое для ячеек было подготовлено в Interface Builder из-за их сложности. Для новых ячеек (в отличие от повторно используемых) содержимое ниба создается с использованием UINib Class. Поскольку для всех ячеек используется только один nib, и каждый раз уменьшать накладные расходы от загрузки файла, я добавил UINib как свойство cellNib
в мой подкласс viewcontroller, который загружаю один раз в моей реализации viewDidLoad.
Теперь для странной части. Все работает нормально, tableview заполняется его данными, и все ячейки настроены с содержимым ниба, как и должно быть. Но как только я просматриваю табличное представление, приложение аварийно завершает работу.
Callstack дал этому: - [NSCFNumber instantiateWithOwner: options:]: непризнанный селектор отправлен в экземпляр Очевидно, что сообщение для создания экземпляра содержимого из cellNib было отправлено неверному объекту. Объект, по которому отправляется сообщение, время от времени различается, поэтому происходит что-то случайное.
Я не понимаю - почему он работает примерно 10 раз при загрузке таблицы, но не больше, когда прокручивается табличное представление?
Если я создаю новый экземпляр UINib каждый времени (как видно из моего кода ниже), тогда все работает нормально, скроллинг включен.
Где я могу сделать ошибку? Является ли указатель на мое свойство UINib разбухающим? Если да, то почему?
Вот код, я использую (я удалил всю загрузку данных и другие вещи, чтобы сделать его более удобным для чтения):
@interface NTDPadViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
NSManagedObjectContext *managedObjectContext;
NSMutableArray *ntdArray;
IBOutlet UITableView *ntdTableView;
UINib *cellNib;
}
@property(nonatomic,retain) NSManagedObjectContext *managedObjectContext;
@property(nonatomic,retain) NSMutableArray *ntdArray;
@property(nonatomic,retain) UITableView *ntdTableView;
@property(nonatomic,retain) UINib *cellNib;
@end
Реализация:
@implementation NTDPadViewController
@synthesize managedObjectContext;
@synthesize ntdArray;
@synthesize ntdTableView;
@synthesize cellNib;
-(void)viewDidLoad {
[super viewDidLoad];
cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setBackgroundColor:[UIColor clearColor]];
// These two should work equally well. But they don't... of course I'm using only one at a time ;)
// THIS WORKS:
UINib *test = [UINib nibWithNibName:@"NTDCell" bundle:nil];
NSArray *nibArray = [test instantiateWithOwner:self options:nil];
// THIS DOESN'T WORK:
NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];
[[cell contentView] addSubview:[nibArray objectAtIndex:0]];
}
return cell;
}
Большое спасибо !!
Вы абсолютно правы. Теперь работает. Не могли бы вы объяснить, почему существует разница между cellNib = и self.cellNib =? Я всегда думал в контексте объекта, ссылающегося на свойство через себя. был «факультативным» ... (глупым мной) – Toastor
@Тоастор: Эти два варианта делают совершенно разные вещи. 'self.cellNib = ...' - это «точечный синтаксис», который вызывает установщик, который в вашем случае сохраняется. 'cellNib = ...' просто прямо присваивает ivar, перезаписывая предыдущее значение указателя. См. Раздел [объявленные свойства] (http://developer.apple.com/library/mac/# documentation/cocoa/conceptual/objectivec/Articles/ocProperties.html) в документах Apple. –
Отлично! Еще раз спасибо! – Toastor