在编译我得到的代码时
“
的开始/结束外观转换的不平衡调用<UINavigationController: 0xa98e050>
”
警告。
这是我的代码
KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
passcodeController.delegate = self;
UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
答案 0 :(得分:57)
我知道这是一个古老的问题,但为了那些再次遇到这个问题的人,这就是我所发现的。
首先,问题并未说明新viewController
被调用的位置
我怀疑这是从-(void)viewDidLoad
将相应的代码移至-(void)viewDidAppear:
,问题应该消失。
这是因为在-viewDidLoad
处,视图已加载,但尚未显示,且动画和视图尚未完成。
如果您的目的是推动窗户,请在窗口出现并涂漆后再进行操作。
如果您发现自己使用计时器来控制系统行为,请问问自己您做错了什么,或者如何更好地做到这一点。
答案 1 :(得分:17)
我发现如果您尝试在前一个事务(动画)正在进行时推送新的视图控制器,则会出现此问题。
无论如何,我认为,presentModalViewController
问题,设置animated:NO
,可能会解决您的问题
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:NO];
其他选项是:
选择NSTimer
并调用上面的代码可能 0.50到1 秒。这也是有用的技巧。所以你以前的viewController已经完成了它的动画。
答案 2 :(得分:9)
当您尝试在先前包含的viewController完成动画之前加载新的viewController时,会出现此警告。如果您打算这样做,只需将代码添加到dispatch_async(dispatch_get_main_queue()
块:
dispatch_async(dispatch_get_main_queue(), ^(void){
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
});
并且警告将消失。
答案 3 :(得分:3)
现代解决方案可能是这样的:
double delayInSeconds = 0.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.window.rootViewController presentViewController:yourVC animated:YES completion:nil];
});
答案 4 :(得分:1)
您没有提供太多上下文,因此我假设您在呈现密码视图控制器时会在启动时发生此错误。
为了摆脱这个警告,我将app delegate注册为导航根视图控制器的代表:
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
((UINavigationController *)self.window.rootViewController).delegate = self;
return YES;
}
然后我在navigationController:didShowViewController:animated:
中使用dispatch_once
:
- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
static dispatch_once_t once;
dispatch_once(&once, ^{
KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
passcodeController.delegate = self;
UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
[(UIViewController *)self.delegate presentViewController:passcodeNavigationController animated:YES completion:nil];
});
}
由于在根视图控制器出现后调用navigationController:didShowViewController:animated:
,不平衡调用开始/结束外观转换警告就消失了。