iOS 9 pushViewController 不工作,在 iOS 8 中一切都按预期工作,零代码更改?

标签 ios iphone ios9 xcode7

当我使用 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/

相关文章:

javascript - 在 iPhone Safari HTML 页面上打开带有图像的 Youtube 视频

iphone - 返回时可能导致 [UIImage imageWithData] 崩溃的原因

ios - 无法在启动时隐藏状态栏

ios - 使用 NSUserActivity 和 CoreSpotlight 框架进行搜索编程的基本区别是什么?如何选择?

iphone - 如何从 iOS 中已有的源代码创建静态库或框架

ios - 如何启用 App Thining 功能?

ios - 以编程方式设置时,UIButton 标题显示为带点

ios - ios自定义导航栏

ios - 突然 fcm 通知在某些 iOS 设备上不起作用

ios - 在没有 Segue 的情况下单击第一个 ViewController 上的按钮后更改第二个 ViewController 的标签文本