我有一个嵌入在导航 Controller (NAV1) 中的 View Controller (VC1)。在它的 viewWillAppear 方法中,我调用以模态方式呈现另一个 View Controller 。在一种情况下,我需要新的 View Controller (VC2) 呈现动画,而在另一种情况下,它应该在没有动画的情况下呈现。 VC2也嵌入了自己的导航 Controller (NAV2)。
当动画标志设置为 TRUE 时一切正常。当我将标志设置为 FALSE 时,出现了一些错误:
1. 我在控制台中收到以下警告:Presenting view controllers on detached view controllers is discouraged
2. 当我在调用 dismissViewControllerAnimated:FALSE completion:nil
后从 VC2 返回时,不会调用 VC1 的 viewWillAppear 方法。如果动画标志设置为 TRUE,则会调用它。
在 VC1 中:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self performSelector:@selector(importStuff:)
withObject:nil];
}
-(void)importStuff
{
//instatntiate VC2
//instantiate NAV2
[Utility presentViewController:pNavController
fromViewController:self
animated:FALSE
completion:nil];
// the above method calls the presentViewController:animated:completion: method
}
在 VC2 中:
[Utility dismissViewController:self
animated:FALSE
completion:nil];
上述方法调用了dismissViewControllerAnimated:方法。
最佳答案
不是解决方案,而是解决方法:
您可以使用 afterDelay:0
轻松地将任何 UI 操作推迟到下一个事件循环:
[self performSelector:@selector(importStuff:)
withObject:nil
afterDelay:0];
这将使当前操作有机会完成。
此外,0.4 的延迟将与操作系统匹配。但是,无论您使用什么延迟(除了 0) 都是一个小问题,不能保证在任何情况、设备和内存负载等情况下都能正常工作。
相反,您应该重新审视您的方法。
改变你的设计:
首先不要冒险遇到这个动画比赛。 您有多种选择,包括:
- 自己控制过渡动画并等待其完成,然后再推送另一个 View Controller (使用完成信号或完成 block )
- 完全改变你的方法来完全避免这个难题
关于ios - viewWillAppear 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350565/