gpt4 book ai didi

objective-c - 我说的对吗 initWithNibName :bundle is used to manually load nib files and that initWithCoder would be used as an alternative?

转载 作者:太空狗 更新时间:2023-10-30 03:52:36 24 4
gpt4 key购买 nike

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

例子:

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

if (self){
// code here
}

return self;
}

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

目前正在学习一本为 ios6 和之前版本的 xode 编写的 ios 大 Nerd 牧场书,并尝试使用 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 中收集到的信息,鼓励使用 Storyboard ,我看不到不使用 Storyboard 的选项。我从本书中学习的教程使用的是 XCode 4.3,其中提供了 nib。

最佳答案

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

为了从 nib(或 Storyboard )的 View Controller 中了解此方法的作用,您必须了解 NSCoding。

当使用 NSCoding 取消归档对象时,它拥有的所有对象都会产生级联效应。 initWithCoder: 被发送到一个对象,它被解冻,然后被发送到它拥有的对象等等。

这是 nib 加载系统用来解冻您在界面构建器中创建的所有对象的方法。

这里简要介绍了 nib 加载系统的功能(来自文档)

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

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

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

另请记住, Storyboard只是 nib 文件的集合,其中包含一些描述它们如何相关的元数据。

关于objective-c - 我说的对吗 initWithNibName :bundle is used to manually load nib files and that initWithCoder would be used as an alternative?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com