我无法使用 initWithNibName:bundle 因为我现在使用的是最新的 XCode (5)。经过一番研究,我找到了一个替代方案:initWithCoder。
Example:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self){
// code here
}
return self;
}
我想了解的是,这是如何替代 initWithNibName 的?
目前正在学习一本针对 ios 的书呆子牧场书籍,该书是为 ios 6 和以前版本的 xcode 编写的,并正在尝试 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;
}
上面的代码是做什么的?它看起来像一个指定的初始值设定项,但参数的名称和返回类型让我感到困惑。感谢这里的一些帮助。
亲切的问候
Update:
根据我在 XCode 5 中收集的信息,鼓励使用故事板,并且我没有看到不使用故事板的选项。我在本书中遵循的教程使用的是可使用笔尖的 XCode 4.3。
NSCoding https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Protocols/NSCoding_Protocol/Reference/Reference.html https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Protocols/NSCoding_Protocol/Reference/Reference.html
为了了解此方法对于笔尖(或情节提要)中的视图控制器的作用,您必须了解 NSCoding。
当使用 NSCoding 取消归档对象时,您会获得其拥有的所有对象的级联效果。 initWithCoder:被发送到一个对象,它被解冻,然后被发送到它拥有的对象等。
这是笔尖加载系统用来解冻您在界面构建器中创建的所有对象的方法。
这是笔尖加载系统的功能的快速概述(来自文档)
- nib文件和引用的资源被加载到内存中
- nib 中创建的对象图是未归档的(NSCoding),这实际上取决于对象的类型。 UIViews 被发送 initWithFrame,UIViewControllers 被发送 initWithcoder 因为它们符合 NSCoding所有其他对象都只是发送 init。
- 所有出口和操作连接(您的 IBOUtlet 和 IBActions)均分别使用 setValue:forKey: 和 setTarget:action: 建立。
- 然后 awakeFromNib 被发送到 nib 中的所有对象
请在此处查看对象加载过程部分下的更多详细信息。https://developer.apple.com/library/ios/documentation/cocoa/conceptual/LoadingResources/CocoaNibs/CocoaNibs.html https://developer.apple.com/library/ios/documentation/cocoa/conceptual/LoadingResources/CocoaNibs/CocoaNibs.html
要点是,当使用 nib 或 Storyboard 时,将从 viewController 调用 initWithCoder,因为这就是系统解冻对象图以及在界面生成器中在这些对象上设置的属性的方式。
另请记住,故事板只是 nib 文件的集合,其中包含一些描述它们之间关系的元数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)