gpt4 book ai didi

iphone - 为什么我的 UIViewController 的指定初始化器从未被调用?

转载 作者:行者123 更新时间:2023-12-03 19:31:30 25 4
gpt4 key购买 nike

我使用基于 View 的应用程序模板创建了一个新的 Xcode 项目。在 View Controller 的 .m 中,我覆盖了这个:

// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Custom initialization

NSLog(@"initWithNibName...");
}
return self;
}


- (id)init {
NSLog(@"initWithNibName...");
return [super init];
}

但是,我从来没有得到过 NSLog。这也是我从其他项目中得到的经验。这个方法永远不会被调用。甚至不是来自 NSObject 的 -init。

View Controller 是在 XIB 文件内创建的。 Nib 加载系统在没有任何初始化的情况下实例化此类,这怎么可能?

为什么?除了 -loadView 和 -viewDidLoad 之外还有什么替代方案?

远离 XIB 文件的另一个重要理由?

最佳答案

来自 iOS Resource Programming Guide

In iPhone OS, any object that conforms to the NSCoding protocol is initialized using the initWithCoder: method. This includes all subclasses of UIView and UIViewController whether they are part of the default Interface Builder library or custom classes you define.

这样想:当您的 View Controller 首次在 Interface Builder 中创建时,指定的初始值设定项就会被调用。然后,当您保存 nib 文件时, View Controller 实例将存储在该文件中。稍后,当加载 nib 时,将从 nib 重新创建实例。

由于它是重新创建而不是第一次创建,因此使用了不同的初始化方法。此方法 (-initWithCoder:) 使用 nib 文件中的值恢复对象的状态,其中可以包括指定初始化程序设置之外的属性设置。此机制依赖于 NSCoding 协议(protocol),该协议(protocol)使其能够普遍适用于许多不同的类。

关于iphone - 为什么我的 UIViewController 的指定初始化器从未被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987035/

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