iPhone - загрузить UIView из файла пера? - PullRequest
4 голосов
/ 05 ноября 2010

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

Завершение приложения из-за необработанного исключения «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];
}

Ответы [ 2 ]

14 голосов
/ 06 ноября 2010

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

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 голосов
/ 05 ноября 2010

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

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

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

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