所以看起来我应该设置我的成员变量viewDidLoad
- 但我对为什么设置这些变量initWithCoder
失败感到困惑,因为两者都是在程序开始时调用的。
特别是我有一行代码:
[worldView setMapType:MKMapTypeSatellite];
其中worldView
是一个IBOutlet
MKMapView
对象。它在 下工作viewDidLoad
,但不是initWithCoder
。
所以看起来我应该设置我的成员变量viewDidLoad
- 但我对为什么设置这些变量initWithCoder
失败感到困惑,因为两者都是在程序开始时调用的。
特别是我有一行代码:
[worldView setMapType:MKMapTypeSatellite];
其中worldView
是一个IBOutlet
MKMapView
对象。它在 下工作viewDidLoad
,但不是initWithCoder
。
initWithCoder
调用时插座尚未连接。从文档中:
在实例化过程中,存档中的每个对象都被取消存档,然后使用适合其类型的方法进行初始化。符合
NSCoding
协议的对象(包括 和 的所有子类UIView
)UIViewController
使用它们的initWithCoder:
方法进行初始化。
...
在所有对象都被实例化和初始化之后,nib 加载代码为所有这些对象重新建立出口和操作连接。然后它调用awakeFromNib
对象的方法。
因此 awakeFromNib
,这将是自定义设置 UI 元素的合适位置。
对象在被调用时还不存在initWithCoder
,它们在viewDidLoad
被调用时存在。initWithCoder
通过注销使用以下内容的值来检查您的方法worldView
:
NSLog(@"World View: %@", worldView);
它会的nil
。它们将在调用之前被初始化viewDidLoad
,因此您可以在那里设置它的属性IBOutlet
。