initWithCoder: вызов по Nib & NSCoding! - PullRequest
1 голос
/ 05 марта 2011

Хорошо, у меня сейчас много проблем, пытающихся заставить initWithCoder: работать правильно.У меня есть загружаемый файл пера, и в моем делегате приложения я вызываю unarchiveWithFile: для контроллера представления, связанного с этим пером, и теперь мое приложение вылетает.Я вижу, что initWithCoder: вызывается дважды, предположительно один раз, когда вызывается awakeFromNib: и затем, когда я вызываю unarchiveWithFile: поскольку контроллер представления соответствует NSCoding.Но теперь или он падает, как только загружается представление или когда я нажимаю IBOutlet.Любые предложения ??

Редактировать: Вот код для initWithCoder:

- (id)initWithCoder:(NSCoder *)coder {
    [super initWithCoder:coder];
    [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    return self;
}

Все, что я делаю, это декодирование массива аннотаций для представления карты, но где-то вдоль линии этот методвызывается дважды, а затем происходит сбой.

Ответы [ 2 ]

0 голосов
/ 05 марта 2011

Не забудьте поставить ноль в ваших методах инициализации. Например. опубликованный вами метод был бы более правильным, если бы вы написали его так:

- (id)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
    } 
    return self;
}

Однако это не является причиной вашей проблемы.

Есть ли веская причина для того, чтобы вы самостоятельно разархивировали свой контроллер вида? Если вы не делаете ничего особенного, вы можете положиться на существующие механизмы, чтобы сделать это. Реализация по умолчанию init для UIViewController ищет перо с тем же именем, что и у вашего контроллера представления, и, если оно существует, загружает перо (через initWithNibName).

Если есть данные, которые необходимо заархивировать, возможно, они не должны быть частью UIViewController. Может быть, в другом месте?

0 голосов
/ 05 марта 2011

вы можете попробовать

- (id)initWithCoder:(NSCoder *)coder {
     if(self == nil)
     {
          [super initWithCoder:coder];
          [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
     }
      return self;
}
...