问题
So it seems like I should be setting my member variables in viewDidLoad
- but I am confused as to why setting these variables in initWithCoder
fails, since both are called at the start of the program.
In particular I have a line of code:
[worldView setMapType:MKMapTypeSatellite];
In which worldView
is a IBOutlet
MKMapView
object. It works under viewDidLoad
, but not initWithCoder
.
回答1:
The objects do not yet exist when initWithCoder
is called, and they do when viewDidLoad
is called. Check your initWithCoder
method by logging out the value of worldView
using something like:
NSLog(@"World View: %@", worldView);
and it will be nil
. They will be initialized before the call to viewDidLoad
, so you can set a property of that IBOutlet
there.
回答2:
The outlets are not yet connected when initWithCoder
is called.
From the documentation:
During the instantiation process, each object in the archive is unarchived and then initialized with the method befitting its type. Objects that conform to the
NSCoding
protocol (including all subclasses ofUIView
andUIViewController
) are initialized using theirinitWithCoder:
method.
...
After all objects have been instantiated and initialized, the nib-loading code reestablishes the outlet and action connections for all of those objects. It then calls theawakeFromNib
method of the objects.
So awakeFromNib
would be a suitable place for the custom setup of your UI elements.
来源:https://stackoverflow.com/questions/20480384/objective-c-ios-development-using-viewdidload-or-initwithcoder-when-setting-vari