2010-11-05 5 views
4

Я подклассифицирую UIView, пытаясь загрузить представление, которое я сбросил в конструкторе интерфейса из файла nib. я получаю следующее сообщение об ошибке на обратную линии:iPhone - Загрузить UIView из файла nib?

Нагрузочного приложение из-за неперехваченное исключение «NSGenericException», причина: «Этот кодировщик требует, чтобы замененные объекты будут возвращены из initWithCoder:»

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    [super initWithCoder:aDecoder]; 
    NSArray *objects = [[NSBundle mainBundle] 
         loadNibNamed:@"MyView" 
         owner:nil 
         options:nil]; 
    if (self = [objects objectAtIndex:0]) 
    { 
    } 
    return [self retain]; 
} 

ответ

13

Вы делаете что-то очень странное)

loadNibNamed:owner:options: будет вызывать initWithCoder: инстанцировать ваш взгляд от xib. Но вы звоните loadNibNamed:owner:options: от initWithCoder:. Бесконечная рекурсия?

Чтобы загрузить вид с XIB вы можете сделать следующее:

@implementation MyView 

+ (MyView*) myView 
{ 
    NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil]; 
    return [array objectAtIndex:0]; // assume that MyView is the only object in the xib 
} 

@end 
+0

Есть ли что-то особенное, что вам нужно сделать, чтобы использовать MyView в другом nib, кроме того, чтобы установить Custom Class в MyView? – qix

0

Скорее чем делать self = [objects objectAtIndex:0] вы должны перебрать массив и убедитесь, что вы получаете правильный объект, например:

for (id object in objects) { 
    if ([object isKindOfClass:[YourClassName class]]) 
     self = (YourClassName*)object; 
} 

То есть, я имею все дни s сделал этот слой вверх и вытащил ссылку прямо из UIViewController. Это ломает уровень абстракции, хотя, так как класс, который просто хочет использовать вид должен был бы знать, что СИБ его в:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"MyView" bundle:nil]; 
YourClassName* view = (YourClassName*)vc.view; 
[vc release]; 
+0

, что это не проблема, есть только один объект в массиве, и первый один всегда правильный один – aryaxt

+2

и я не» t хочу использовать viewController, все, что я хочу, это пользовательское представление, генерируемое из nib – aryaxt

Смежные вопросы