当我使用 pushViewController
时,将调用 viewWillDisappear
(第一个 View Controller )。在那之后,屏幕卡住,因此没有执行任何操作,我将断点放在 nextviewcontroller
上,它不会在 viewDidLoad
方法中被调用。
//first View Controller from where pushViewController
[[AppCommonFunctions sharedInstance]pushVCOfClass:[NextViewController class] fromNC:[self navigationController] animated:YES popFirstToVCOfClass:nil modifyVC: ^(id info) {
[((NextViewController *)info)setEventInfo : object];
}];
//common method for push view controller in another file
- (void)pushVCOfClass:(Class)class1 fromNC:(UINavigationController *)nc animated:(BOOL)animated popFirstToVCOfClass:(Class)class2 modifyVC:(operationACFFinishedBlock)modify {
RESIGN_KEYBOARD
[self popToViewControllerOfKind : class2 from : nc];
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:[class1 description]];
if (modify) {
modify(vc);
modify = nil;
}
[nc pushViewController:vc animated:animated];
}
- (UIViewController *)popToViewControllerOfKind:(Class)aClass from:(UINavigationController *)navController {
RESIGN_KEYBOARD
if (aClass) {
NSArray *arrayOfViewControllersInStack = navController.viewControllers;
for (int i = 0; i < arrayOfViewControllersInStack.count; i++) {
if ([[arrayOfViewControllersInStack objectAtIndex:i] isKindOfClass:aClass]) {
int index = (i > 0) ? (i - 1) : i;
[navController popToViewController:[arrayOfViewControllersInStack objectAtIndex:index] animated:NO];
break;
}
}
return [navController topViewController];
}
return nil;
}
最佳答案
我也遇到了这个问题。我发现 pushViewController:animated:
后 CPU 使用率为 100%,并且 runloop 卡住了。 View Controller 无法在 loadView
中加载 View 。
在 iOS 9 中,loadView
过程可能在内部发生了变化,或者 Storyboard/xib 文件由于 Xcode 7 而被错误构造(可能只是一个错误)。
第1步,尝试在推送前加载 View
我尝试打印 view
属性以强制调用 loadView
的 View Controller 。
UIViewController *vc = ...;
NSLog(@"vc.view: %@", vc.view); // Never print
[self.navigationController pushViewController:vc animated:YES];
我发现在调用 view
属性时无法加载 View 。 NSLog()
不会打印 View 对象,runloop 卡住了。
第二步,加载 View 时显示调用堆栈
在目标 View Controller 中添加以下 loadView
实现。
- (void)loadView
{
NSLog(@"will loadView");
[super loadView];
NSLog(@"did loadView");
}
构建并运行您的应用程序,并尝试通过调用属性 view
来触发 loadView
。现在您应该会发现该应用卡在目标 View Controller 中的 [super loadView]
处。
现在尝试多次暂停执行(Debug » Pause,或cmd + ctrl + Y
),你应该会发现应用程序(runloop)几乎卡在了一些特定的方法上。在我的实例中,我的应用卡在 -[NSLocalizableString length]
(或 objc_msgSend
)。
我认为这是调试的提示(我的 View Controller 是由 Storyboard构建的, Storyboard直接在项目中本地化)。
更新
在我通过版本控制 (git) 将 Storyboard文件重置为以前的版本后,应用程序运行良好并且 View 加载成功。
关于iOS 9 pushViewController 不工作,在 iOS 8 中一切都按预期工作,零代码更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32740290/