【发布时间】:2015-09-21 18:46:18
【问题描述】:
我正在使用展开转场来展开到情节提要中的初始视图控制器。展开效果很好,我在初始视图控制器中实现了这个方法:
- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {
}
但是,如果我在展开后尝试转到另一个视图控制器,则会收到以下错误:
警告:尝试在 谁的视野不在窗内 等级制度!
似乎只有当我展开到在情节提要中被检查为“初始视图控制器”的视图控制器时才会发生这种情况。这是一个错误吗?我应该能够放松到那个初始控制器吗?其他想法?
编辑:
这是我执行第二个转场的方式:
[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 也总是在主线程上调用成功/失败块。
棘手的部分。如果我将上面的代码更改为使用块而不是委托,故事板/segue 就不会搞砸,我可以多次登录和注销。
为什么 segue 第一次使用委托模式工作,但在注销(展开)时,我不能再次使用该 segue 吗?
编辑 3:
更多调查显示,在展开时,我的登录 VC viewDidAppear 被调用了两次。在初始展开时,视图看起来仍然在堆栈上,显示它快速显示并调用 viewDidAppear。然而,这很快就被动画化了,并且 viewWillAppear 被另一个 VC 第二次调用。我认为这可能是问题的根源。为什么当我放松到那个 VC 时,它被动画化了,却又被动画化了?
【问题讨论】:
-
你最初的 viewController 是什么?另外,第二个segue你做的怎么样?
-
看来你切换到下一个控制器太快了。
-
@Jay 我添加了我如何以编程方式进行转场。
-
@kirander 不确定这怎么可能,因为我是在单击按钮时进行的。 IE 我放松到我的登录控制器,并且可以在我点击登录按钮之前等待,并且 segue 不起作用。再次,这只发生在我放松之后,第一次工作。
-
第二个 segue 示例中的
self是什么对象?
标签: ios objective-c unwind-segue