gpt4 book ai didi

cocoa - initWithNibName 要么调用了两次,要么加载了错误的 xib

转载 作者:行者123 更新时间:2023-12-03 17:57:43 29 4
gpt4 key购买 nike

我正在编写一个 Cocoa 应用程序,并希望该应用程序作为一种向导来工作。因此,在主窗口中,我有一个自定义 View ,它与用户交互,并在用户逐步完成向导的各个阶段时从登录更改为设备激活屏幕。我目前已经重写了 WizardViewController 的 awakeFromNib 方法:

- (void)awakeFromNib{
//If no redirect request save, add first view: ID Login
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *tokenRequest = [defaults objectForKey:@"redirectRequestToken"];
if (!tokenRequest){
SignInWithIDViewController *signInViewController = [[SignInWithIDViewController alloc] initWithNibName:@"SignInWithIDViewController" bundle:nil];
[wizardView addSubview:[signInViewController view]];
} else {
NSLog(@"Have already logged in.");
}
}

照原样,SignInIDViewController 中的 initWithNibName 被调用两次,一次是由我显式调用,另一次是在加载 View 时(大概是通过 loadView)。但是,如果我只是调用 init,则 initWithNib name 仅被调用一次,但会加载错误的 xib 文件(属于 DeviceActivationViewController 类)。我似乎无法弄清楚我做错了什么,因为signInViewController不应该被初始化两次,但我需要IB中正确的xib文件来显示。

目前我在此类中拥有的唯一不是用户界面 IBAction 的其他方法是生成的 initWithNibName 方法以及添加的 NSLog 语句。

最佳答案

我认为在 IB 中创建对象(蓝色立方体)并在代码中实例化它们是问题所在。如果您在 IB 中为它们创建了对象,那么它们将在 awakeFromNib 中实例化,您不应该在代码中对它们调用 alloc init ——这将创建一个新实例。

我在 OSX 中使用 View Controller 的经验不多,但似乎无法将 IBActions 连接到 View Controller (作为文件的所有者)。我使其工作的方法是对自定义 View 进行子类化(在添加 View Controller 时为您创建),将该 View 的类更改为新的子类,并将操作方法​​放入该类中。看起来这应该是由 View Controller 处理的事情,但我认为它不起作用与 View Controller 不在 OSX 中的响应者链中有关(而我认为它在 iOS 中)。

编辑后:在绕道研究内存管理问题后,我想我找到了最好的方法来做到这一点。您可以而且可能应该(为了符合 Apple 的 MVC 范例)将按钮方法放在 View Controller 类中,而不是像我上面所说的那样放在 View 中。实际上,您可以将 IBActions 连接到 View Controller (作为文件的所有者),您只需确保在代码中实例化 View Controller 时保留 View Controller 即可。为此,您需要在您实例化 SignInViewController 类的任何类中将 SignInViewController 设为属性,并在属性声明中使用“retain”。那么您不需要(也不应该)在 IB 中创建任何蓝色立方体。

关于cocoa - initWithNibName 要么调用了两次,要么加载了错误的 xib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835000/

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