我正在使用展开segue来展开我的故事板中的初始视图控制器。展开效果很好,我在初始视图控制器中实现了这个方法:
- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {
}
但是如果我在展开后尝试使用segue到另一个视图控制器,我会收到以下错误:
警告:尝试出现 谁的观点不在窗口 层次!
似乎只有当我放松到被检查为'初始视图控制器'的视图控制器时才会出现这种情况。在故事板中。这是一个错误吗?我应该能够放松到初始控制器吗?其他想法?
修改
以下是我执行第二个segue的方法:
[self performSegueWithIdentifier:@"mySegue" sender:nil];
我应该注意这是一个登录/注销问题。当我第一次登录从登录控制器到下一个控制器的segue工作时。当我退出时,我放松到初始视图控制器。然后我再次登录,从我的登录控制器到下一个控制器的segue不起作用。
编辑2:
我从更多的研究中找到了它,因为我正在使用委托登录。登录是异步的,我用AFNetworking打电话,当它完成后我调用我的登录委托(在这种情况下登录VC)。此时,登录VC可以转到视图。
登录代码:
- (void) login: (NSDictionary *) parameters {
[http.manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
[self.loginDelegate loginSuccess:response];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self.loginDelegate loginFailure:error];
}];
}
我的登录VC是代表:
- (void) loginSuccess:(NSDictionary *) response {
// setup user info based on response
...
// Segue
[self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}
我已经检查过我是主线程的时候和我一起但仍然没有运气。我知道AFNetworking也总是调用主线程上的成功/失败块。
棘手的部分。如果我将上面的代码更改为使用块而不是委托,则storyboard / segue不会搞砸,我可以多次登录和注销,没有任何问题。
为什么segue第一次使用委托模式,但在注销(展开)时,我是否可以不再使用该segue?
编辑3:
更多调查显示,在展开我的登录VC viewDidAppear被调用两次。在初始展开时,视图仍然在堆栈中,显示它快速显示并调用viewDidAppear。然而,这很快就会被动画化,而viewWillAppear会被另一个VC称为第二次。我认为这可能是问题的根源。为什么当我放松到那个VC的时候,它的动画效果只会被动画回来?
答案 0 :(得分:1)
请在第二次登录尝试时检查loginDelegate
是否为nil
。 如果是另外请检查nil
,“委托调用”将无处可去。loginDelegate
是否指向您期望的实例。如果它指向“旧”实例,则可能会尝试显示错误的视图。
可以按意外顺序调用方法集viewDidLoad
,viewDidAppear
,viewWillAppear
等,尤其是在返回导航或展示广告并从中返回时。如果您在这些方法中分配了不同的初始化/设置任务,则最终可能会使用部分初始化的视图控制器。
(考虑到这个问题,我失去了关于遇到的错误的陈述,所以代表可能不是nil。)
修改强>
我运行了一个小的展开测试项目并记录了viewDidAppear
次调用:
viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <VC3: 0x7a694d50>
unwind target
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <VC3: 0x7a694d20>
unwind target
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <ViewController: 0x7a687700>
在VC3
中进行展开会简要显示VC2
,最终会以目标ViewController
结束。现在第二个“登录”导致视图控制器的不同实例。
您是否保留对“旧”视图控制器的引用?
另一个原因可能是,您的“注销”检测会触发两次(一次是在展开时,另一次是在中间或初始视图控制器检测到需要登录时?)。