initWithCoder:被nib和NSCoding调用!

问题描述 投票:1回答:2

好的,我现在遇到很多问题试图让initWithCoder:正常工作。我有一个加载的nib文件,在我的app委托中,我调用unarchiveWithFile:对于与该nib关联的视图控制器,现在我的应用程序崩溃了。我可以看到initWithCoder:被调用两次,大概是从调用awakeFromNib:时开始调用,然后从调用unarchiveWithFile开始调用:因为视图控制器符合NSCoding。但是现在要么在视图加载时或者在按下IBOutlet时崩溃。有什么建议??

编辑:这是initWithCoder的代码:

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

我正在做的就是为地图视图解码一个注释数组,但是在这个方法的某个地方,这个方法被调用两次然后崩溃了。

iphone archive nib nscoding
2个回答
0
投票

不要忘记在你的init方法中加入nil检查。例如。如果你把它写成:你发布的方法会更正确:

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

但是,这不是你问题的原因。

您是否有充分理由自行取消归档视图控制器?如果你没有做任何特别的事情,你可以依靠现有的机制去做。 UIViewController的init的默认实现查找与视图控制器同名的nib,如果存在,则加载nib(通过initWithNibName)。

如果存在需要存档和存档的数据,则可能不应该是UIViewController的实际部分。也许在其他地方考虑它?


-1
投票

你可以试试

- (id)initWithCoder:(NSCoder *)coder {
     if(self == nil)
     {
          [super initWithCoder:coder];
          [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]];
     }
      return self;
}
© www.soinside.com 2019 - 2024. All rights reserved.