【问题标题】:iOS 9 pushViewController not working, in iOS 8 everything works as expected, zero code changes?iOS 9 pushViewController 不起作用,在 iOS 8 中一切正常,零代码更改?
【发布时间】:2015-09-23 12:58:56
【问题描述】:

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

【问题讨论】:

  • 当你推送它时它是 vc 非 nil -- 添加 assert(vc) 和 assert(nc) 也
  • 我可以在哪里添加断言?你能解释一下吗@Daij-Djan
  • assert(vs != nil) 在你推送之前

标签: ios iphone ios9 xcode7


【解决方案1】:

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

loadView 进程可能在 iOS 9 内部发生了更改,或者由于 Xcode 7 导致情节提要/xib 文件构造错误(可能只是一个错误)。

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

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

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

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

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

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

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

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

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

我认为这是调试的提示(我的视图控制器是由storyboard构建的,并且storyboard直接本地化在项目中)。


更新

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

【讨论】:

  • 我的行为完全相同,我不得不在我的故事板中重新创建整个视图控制器并将所有内容重新附加到我的班级
  • 按照上面的步骤,它卡在了 objc_msgSend .... 我要怎么解决这个问题? @BrettDiDonato
【解决方案2】:

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

【讨论】:

  • 更改其(UITextView)故事板中文本的默认值
【解决方案3】:

这是 iOS 9.0 的错误。 UITextView 默认最少有 10 个字符。但是,您可以稍后在 viewDidLoad 方法中更改它。 参考:UITextView with text less than 10 characters hangs iOS 9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多