gpt4 book ai didi

objective-c - 如何编写防止调用 viewDidLoad 的自定义初始化程序?

转载 作者:行者123 更新时间:2023-12-04 06:10:10 25 4
gpt4 key购买 nike

我想为 UIViewController 构建自定义初始化方法,但是在互联网上,特别是在 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 的方法属性(property):
- (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我已经实现了。

问题是什么?我已经在 parent 的 initWithNibName 中初始化了一个 subview 方法,而不是遵循延迟加载技术并在 viewDidLoad 中执行.当WallpaperDetailsViewController正在调用它的父初始化程序,它变得困惑并导致 viewDidLoad行为不当。

解决方案?我将父类中的每个 subview 初始化移动到它的 viewDidLoad方法,并保留我对 WallpaperDetailsViewController 的原始实现完好无损的。现在一切都按预期工作

感谢@Josh Caswell 和@logancautrell

关于objective-c - 如何编写防止调用 viewDidLoad 的自定义初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862421/

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