performSegueWithIdentifier and viewDidLoad

3

主视图控制器:

[self performSegueWithIdentifier:@"showNextVC sender:self];

Segue目标控制器:

- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"Show text!");
[self performSegueWithIdentifier:@"showSignUp" sender:self]; }

为什么目标控制器的viewDidLoad方法中的代码不执行?

编辑问题并添加日志中显示的错误:"视图未加载到窗口层次结构中"。PKP回复了正确的解决方案。 - Gaucho
第一个segue有效吗? - LinusGeffarth
1
你应该在 viewDidAppear 中调用 performSegue... 方法。 - Savas Adar
2个回答

13

当ViewController对象加载nib文件时,会调用viewDidLoad方法。此时该对象尚未附加到窗口。您应在viewDidAppear中调用performSegue...方法。

最后,如果您直接调用performSegue而没有执行任何操作,请重新检查流程。


那么viewDidLoad方法只会被调用Storyboard的初始场景吗? - Bogdan Pop
不是的。它在每个ViewController创建时被调用(当您执行[[ViewController alloc] initWithNib:]并成功创建时)。在这种情况下,当您准备Segue时,它会在内部被调用。 - PKP
所以,我执行 performSegue... 然后 destinationViewController 进行 alloc 和 initwithnib 操作,之后会执行 viewDidLoad 方法。我的理解对吗? - Bogdan Pop
导航转换在意料之外的状态下结束。导航栏子视图树可能会损坏。我收到了这个错误信息。 - Bogdan Pop
你是在viewWillAppear或viewDidAppear中推送新的segue吗?如果不知道上下文,很难猜测问题所在。如果第一个视图控制器中只是推送第二个视图控制器而没有任何操作,为什么不直接推送第二个视图控制器呢? - PKP

0

如果你复制并粘贴了代码,我会认为是因为你缺少一个引号,编译器应该会警告你的。

如果引号已经存在,请在你的“prepare for segue”方法中尝试使用NSLog来查看它是否被调用。


同时,如果出现问题,请检查您在Storyboard中的Segue标识符,并确保它们匹配。 - user4254887
它在我的模拟器中显示目标控制器,所以segue运行正常,只是目标视图的viewdidload方法没有执行?我不明白为什么..(我检查了故事板标识符,一切都没问题) - Bogdan Pop
尝试将视图设置为初始视图控制器,看看是否被调用。同时确保该控制器具有正确的故事板类。 - user4254887
如果调用了load view,则应始终调用viewdidload。如果该视图在不加载类的情况下加载,则不会收到通知。 - user4254887

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接