iOS 9 pushViewController 不工作,在 iOS 8 中一切正常,零代码更改?

iOS 9 pushViewController not working, in iOS 8 everything works as expected, zero code changes?

当我使用 pushViewController 时,会调用 viewWillDisappear(第一个视图控制器)。在那之后,屏幕冻结,因此没有执行任何操作,我将断点放在 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;
}

我也遇到这个问题。我发现 CPU 使用率在 pushViewController:animated: 之后是 100%,并且 运行 循环卡住了。视图控制器无法加载 loadView 中的视图。

loadView 进程可能在 iOS 9 中被内部更改,或者 storyboard/xib 文件由于 Xcode 7 而被错误构造(可能只是一个错误)。

第一步,尝试在推送前加载视图

我尝试打印 view 属性 以强制视图控制器调用 loadView

UIViewController *vc = ...;
NSLog(@"vc.view: %@", vc.view);  // Never print
[self.navigationController pushViewController:vc animated:YES];

我发现在调用 view 属性 时无法加载视图。 NSLog() 不会打印视图对象,运行 循环卡住。

第2步,加载视图时显示调用堆栈

在目标视图控制器中添加以下 loadView 实现。

- (void)loadView
{
  NSLog(@"will loadView");
  [super loadView];
  NSLog(@"did loadView");
}

构建并 运行 您的应用程序,并尝试通过调用 属性 view 来触发 loadView。现在您应该会发现该应用程序卡在目标视图控制器中的 [super loadView]

现在尝试多次暂停执行(Debug » Pause,或cmd + ctrl + Y),您应该会发现应用程序(运行loop)几乎卡在了某些特定的方法上。在我的例子中,我的应用程序卡在 -[NSLocalizableString length](或 objc_msgSend)。

我认为这是调试的提示(我的视图控制器是通过故事板构建的,故事板直接在项目中本地化)。


更新

我通过版本控制(git)将故事板文件重置为以前的版本后,应用运行良好,视图加载成功。

如果您的 NextViewController 有任何 UITextView,您必须在情节提要中提供其 默认文本值 并通过执行此操作从代码中更改其值,它对我来说很好,您也可以尝试。 (我不解释这背后的原因,但它对我有用)

这是 iOS 9.0 的错误。默认情况下,UITextView 应至少包含 10 个字符。但是您可以稍后在 viewDidLoad 方法中更改它。 参考: