gpt4 book ai didi

iOS - 放松到我的初始 View Controller

转载 作者:可可西里 更新时间:2023-11-01 04:50:44 27 4
gpt4 key购买 nike

我正在使用展开转场来展开到 Storyboard 中的初始 View Controller 。展开效果很好,我在初始 View Controller 中实现了这个方法:

- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {

}

但是,如果我在展开后尝试转到另一个 View Controller ,则会收到以下错误:

Warning: Attempt to present on whose view is not in the window hierarchy!

似乎只有当我展开到在 Storyboard 中被检查为“初始 View Controller ”的 View Controller 时才会发生这种情况。这是一个错误吗?我应该能够放松到那个初始 Controller 吗?其他想法?

编辑:

这是我执行第二个转场的方式:

[self performSegueWithIdentifier:@"mySegue" sender:nil];

我应该注意到这是一个登录/注销问题。当我第一次登录时,从我的登录 Controller 到我的下一个 Controller 的 segue 工作。当我注销时,我会放松到初始 View Controller 。然后我再次登录,从我的登录 Controller 到下一个 Controller 的 segue 不起作用。

编辑 2:

从更多研究中我发现它是因为我使用代理登录。登录是异步的,我使用 AFNetworking 进行调用,完成后我调用我的登录委托(delegate)(在本例中为登录 VC)。此时登录 VC 可以继续查看 View 。

登录代码:

- (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 是委托(delegate):

- (void) loginSuccess:(NSDictionary *) response {
// setup user info based on response
...
// Segue
[self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}

我检查了我何时在主线程中并且我继续并且仍然没有运气。我知道 AFNetworking 也总是在主线程上调用成功/失败 block 。

棘手的部分。如果我将上面的代码更改为使用 block 而不是委托(delegate), Storyboard/segue 不会搞砸,我可以多次登录和注销而没有问题。

为什么 segue 第一次使用委托(delegate)模式,但在注销(展开)时,我不能再次使用该 segue 吗?

编辑 3:

更多调查显示,在展开时,我的登录 VC viewDidAppear 被调用了两次。在初始展开时, View 看起来仍然在堆栈上,显示它快速显示并调用 viewDidAppear。然而,这很快就被动画化了,并且 viewWillAppear 被另一个 VC 第二次调用。我认为这可能是问题的根源。为什么当我放松到那个 VC 时,它被动画化了,却又被动画化了?

最佳答案

请在第二次登录尝试期间检查您的 loginDelegate 是否为 nil如果是nil,“委托(delegate)调用”将无处可去。 另外请检查loginDelegate 是否指向您期望的实例。如果它指向一个“旧”实例,则可能会尝试呈现错误的 View 。

viewDidLoadviewDidAppearviewWillAppear 等方法集可能会以意想不到的顺序被调用,尤其是在返回导航或呈现时广告并从中返回。如果您在这些方法之间分配了不同的初始化/设置任务,您最终可能会得到一个部分初始化的 View Controller 。

(考虑问题我丢失了你关于遇到的错误的陈述,所以可能delegate不是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 处结束。现在第二个“登录”会导致 View Controller 的不同实例。

您是否保留对“旧” View Controller 的引用?

另一个原因可能是,您的“注销”检测会触发两次(一次是在展开时触发,另一次是在中间或初始 View Controller 检测到需要登录时?)。

关于iOS - 放松到我的初始 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702485/

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