У меня что-то странное происходит с использованием UINib, хотя я подозреваю, что настоящая проблема может быть похоронена в другом месте.
Мое приложение использует просмотр таблицы, содержимое ячеек было подготовлено в Интерфейсном Разработчике из-за их сложности. Для новых ячеек (в отличие от повторно используемых) содержимое пера создается с использованием UINib Class . Поскольку для всех ячеек используется только один кончик, и чтобы уменьшить накладные расходы при загрузке файла каждый раз, я добавил UINib как свойство cellNib
в мой подкласс viewcontroller, который я загружаю один раз в своей реализации viewDidLoad.
Теперь о странной части. Все работает нормально, табличное представление заполнено данными, и все ячейки настроены с содержимым пера, как и должно быть. Но как только я прокручиваю таблицу, приложение вылетает.
Коллстэк дал это: - [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;
}
Большое спасибо !!