我是否正确地说initWithNibName:bundle用于手动加载nib文件,initWithCoder将用作替代?

Lon*_*Guy 5 cocoa cocoa-touch objective-c core-location nib

我不能使用initWithNibName:bundle see,因为我现在正在使用最新的XCode(5).经过一些研究,我找到了另一种选择:initWithCoder.

例:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self){
       // code here
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

我想要了解的是这是如何替代initWithNibName的?

目前正在学习ios的大书呆子牧场书,这本书是为ios6和之前版本的xode编写的,并试验了coreLocation框架.

在下面的代码中,我已经替换了initWithNibName.我也在早期的教程中使用相同的初始化程序完成了这项工作,但如果我不完全理解一章,我就无法继续学习教程.苹果文档并不总是有意义的.通常,stackoverflow答案和重新阅读的组合有助于事物陷入困境.

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self){
        //create location manager object
        locationManager = [[CLLocationManager alloc] init];

        //there will be a warning from this line of code
        [locationManager setDelegate:self];

        //and we want it to be as accurate as possible
        //regardless of how much time/power it takes
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

        //tell our manager to start looking for it location immediately
        [locationManager startUpdatingLocation];
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是做什么的?它看起来像一个指定的初始值设定项,但参数的名称和返回类型让我感到困惑.欣赏会在这里有所帮助.

亲切的问候

更新:

从我在XCode 5中收集的内容中鼓励使用故事板,我没有看到不使用故事板的选项.我正在阅读本书的教程是使用XCode 4.3,其中可以使用nib.

Myr*_*law 5

NSCoding https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

为了理解此方法对于来自笔尖(或故事板)的视图控制器的影响,您必须了解NSCoding.

使用NSCoding取消归档对象时,您将获得它拥有的所有对象的级联效果.initWithCoder:被发送到一个对象,它被解冻,然后被发送到它拥有的对象等.

这是nib加载系统用于解冻您在界面构建器中创建的所有对象的内容.

以下是nib加载系统所做的快速概述(来自文档)

  1. nib文件和引用的资源被加载到内存中
  2. 在nib中创建的对象图是未归档的(NSCoding)这实际上取决于对象的类型.UIViews被发送到initWithFrame,UIViewControllers被发送到initWithcoder,因为它们符合NSCoding,所有其他对象都只是发送init.
  3. 使用setValue:forKey:和setTarget:action:分别建立所有出口和操作连接(您的IBOUtlets和IBActions).
  4. 然后将awakeFromNib发送到nib中的所有对象

在此处查看对象加载过程部分下的更多详细信息. https://developer.apple.com/library/ios/documentation/cocoa/conceptual/LoadingResources/CocoaNibs/CocoaNibs.html

关键是当使用nib或storyboard时,将从viewController调用initWithCoder,因为这是系统解冻对象图的方式,以及您在界面构建器中对这些对象设置的属性.

还要记住,故事板只是一组nib文件,其中包含一些描述它们相关性的元数据.