5

我不能使用 initWithNibName:bundle,因为我现在使用的是最新的 XCode (5)。经过一番研究,我找到了一个替代方案:initWithCoder。

例子:

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

    if (self){
       // code here
    }

    return self;
}

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

目前正在学习一本为 ios6 和以前版本的 xode 编写的 ios 书,并尝试使用 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;
}

上面的代码在做什么?它看起来像一个指定的初始化器,但参数的名称和返回类型让我感到困惑。会感谢一些帮助。

亲切的问候

更新:

从我在 XCode 5 中收集的内容来看,鼓励使用故事板,我看不到不使用故事板的选项。我从本书中学习的教程使用的是 XCode 4.3,其中 nib 可用。

4

2 回答 2

5

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

为了从 nib(或情节提要)了解这种方法对于视图控制器的作用,您必须了解 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

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

还要记住,故事板只是 nib 文件的集合,其中包含一些描述它们如何相关的元数据。

于 2013-10-09T01:41:22.350 回答
-1

不用担心.. 我们仍然可以使用 -[NSViewController initWithNibName:bundle]。你确定你是从 NSViewController 子类化你的控制器并覆盖 initWithNibName:bundle 吗?

于 2013-10-09T14:14:50.927 回答