实例化模态视图控制器会冻结应用程序 - Xcode 7 可能存在问题

Instantiating Modal view controller freezes the app - Probable issue with Xcode 7

我在 iOS 应用程序中以模态方式呈现视图控制器。问题是没有崩溃,应用程序在调用 presentViewController:animated 后立即冻结。统计数据显示 CPU 使用率为 100%,即使在手动关闭应用后使用率也没有下降。

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
CustomModalViewController *vvc = [sb instantiateViewControllerWithIdentifier:@"CustomModalViewController"];
if(!vvc){
    NSLog(@"ERROR!!! vvc is null");
}
NSLog(@"instantiate modal view controller");

vvc.providesPresentationContextTransitionStyle = YES;
vvc.definesPresentationContext = YES;
vvc.data = data;
NSLog(@"before presenting modal view controller");
[vvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vvc animated:YES completion:nil];

我尝试在自定义 class 的 viewDidLoad 中打印一些调试语句,但也没有调用这些语句。

我不明白为什么没有显示视图控制器。任何帮助将不胜感激。我想知道在什么情况下您的应用会在推送视图控制器时进入无限循环,还是因为其他原因??

更新:

这个错误发生在我更新到 XCode 7 之后。不确定,但我猜这可能是新 SDK(UIKit 或 LLVM 编译器)的问题。我用 Xcode 6.4 将我的项目复制到另一个 mac,错误消失了!!!我也没有更改任何会导致问题的构建设置。

关于如何进行的任何指示?

好吧,这很奇怪,但我希望它能有所帮助:我有完全相同的问题,CPU 跳到 100% 并且视图从不显示。在 Xcode 6.4 中运行良好。在 Xcode 7.1 中,在我调用的视图中,我有一个带有一些占位符文本 "Notes:" 的 UITextView。我发现,如果我清除占位符文本,视图 LO​​ADS 和所有过程都会正常执行。如果占位符文本长度大于 9 个字符,则视图也会加载,过程也会正常执行。如果占位符文本长度 >0 且 < 10,则不行。没有观看,CPU 为 100%。这很奇怪,我意识到,但希望它能帮助你。和你一样,我没有显示任何错误或控制台输出,它只是旋转。

编辑 仅供参考,删除故事板中的占位符文本,只需在代码中设置它即可解决此问题,而不管长度如何

同样的问题。

我有一个带有默认字符串“Text”的 UITextView,但在 100% CPU 加载时失败。我只将占位符放在代码中,但直到我从情节提要中删除“文本”才起作用。

我的代码是在 Xcode 6 中开发的,我在发送使用 xcode 7 构建的新应用程序修订版后注意到此错误。

我遇到了与 OP 和答案中描述的完全相同的问题:

  1. 呈现一个视图控制器(在我的例子中是 PageViewController
  2. 呈现的视图控制器有一个按钮,按下该按钮会呈现另一个视图控制器以添加注释
  3. 在呈现 "note" 视图控制器时将应用移至后台。然后把它带回前台。
  4. 该应用程序现已冻结。当连接到调试器时,它似乎无限期地冻结,但是当 运行 in prod 时它崩溃了。 CPU 固定在 100%,内存使用率正在攀升。

我最终追踪到我的 "Note" 视图被设置为第一响应者,当我的视图出现时,通过 override func viewWillAppear(_ animated: Bool),我将注释 UITextView 设置为第一响应者响应者,noteTextView.becomeFirstResponder()

如果我删除该行并且从未点击注释字段,我的应用程序将成功从后台恢复。

为了解决这个问题,我最终添加了应用程序移至后台和移至前台的观察者。在这些观察者中,我分别使注释文本视图成为和退出 firstResponder。

    override func viewDidLoad() {
        super.viewDidLoad()
        //set up your view controller here. 

        NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
    }

    @objc func appMovedToForeground() {
        self.noteTextView.becomeFirstResponder()
    }

    @objc func appMovedToBackground() {
        self.noteTextView.resignFirstResponder()
    }

我不确定我是否应该做一些不同的事情来防止这个问题,或者当应用程序进入后台时退出第一响应者是否是最佳做法,但这似乎对我有用。