我想为 UIViewController
构建一个自定义 init 方法,但是在互联网上特别是在 SO 中深入研究后,我对指定的初始值设定项感到困惑。
我有一个带有这两个初始化器的 UIViewController
子类:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if ( self ) {
}
return self;
}
- (id) initWithFilename:(NSString *)aFilename {
self = [self initWithNibName:@"WallpaperDetailsViewController" bundle:nil];
if ( self ) {
self.filename = aFilename;
}
return self;
}
然后我有一个 viewDidLoad
方法,可以根据 filename
属性自定义 View :
- (void)viewDidLoad {
[super viewDidLoad];
// Create a UIImageView to display the wallpaper
self.wallpaper = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.filename]];
// ...
}
在另一个 UIViewController
中,我进行以下调用:
WallpaperDetailsViewController *detailsViewController = [[WallpaperDetailsViewController alloc] initWithFilename:@"foobar.png"];
[[self navigationController] pushViewController:detailsViewController animated:YES];
结果是 viewDidLoad
由于 [self initWithNibName:]
被调用,它不会初始化 UIImageView
因为 self.filename
为空。
根据其他 SO 问题和答案,这应该是预期的行为。由于我自己在 iOS 5 之前的其他项目中的经验,我对此不确定。我的问题是:
如何确保 viewDidLoad:
在 initWithFilename:
之后调用,而不是在 initWithFilename:
和 initWithNibNameOrNil:bundle:
?
如果这是不可能的,我如何实现接收自定义数据来创建和自定义 View 的初始化方法?
谢谢!
最佳答案
我发现了问题。
WallpaperDetailsViewController
并不是直接从 UIViewController
继承,而是从我实现的另一个自定义 UIViewController
继承。
问题出在哪里?我已经在父级的 initWithNibName
方法中初始化了一个 subview ,而不是遵循延迟加载技术并在 viewDidLoad
中执行此操作。当 WallpaperDetailsViewController
调用其父初始化器时,它变得困惑并导致 viewDidLoad
无法正常运行。
解决方案?我将父类中的每个 subview 初始化移至其 viewDidLoad
方法,并保持 WallpaperDetailsViewController
的原始实现不变。现在一切都按预期进行
感谢@Josh Caswell 和@logancautrell
关于objective-c - 如何编写一个自定义初始化程序来防止 viewDidLoad 被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862421/