实例化模式视图控制器冻结了应用程序-Xcode 7可能出现的问题

问题描述 投票:4回答:3

我正在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];

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

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

更新:

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

关于如何进行操作的任何指针?

ios xcode6 modalviewcontroller xcode7 presentviewcontroller
3个回答
6
投票

好吧,这很奇怪,但我希望它能有所帮助:我遇到了完全相同的问题,CPU跳到100%并且视图从不显示。在Xcode 6.4中可以很好地工作。在Xcode 7.1中,在我要调用的视图上,我得到了带有一些占位符文本“ Notes:”的UITextView。我发现,如果清除了占位符文本,则视图LOADS和所有过程都将正常执行。如果占位符文本长度大于9个字符,则视图也会加载,并且过程将照常执行。如果占位符文本长度> 0且<10,则不可行。无视图和100%CPU。我知道这很奇怪,但希望能对您有所帮助。像您一样,我没有错误或控制台输出显示,只是旋转。

[EDIT仅供参考,将情节提要中的占位符文本清空,然后仅在代码中进行设置即可解决此问题,无论长度如何


0
投票

这里是同一问题。

我有一个UITextView,其默认字符串为“ Text”,并且由于100%CPU负载而失败。我只是将占位符放入代码中,但是直到从情节提要中删除“文本”才起作用。

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


0
投票

我遇到了与OP和答案中所述的相同的确切问题:

1)提供一个视图控制器(在我的情况下是一个PageViewController)2)所呈现的视图控制器具有一个按钮,当按下该按钮时,它将呈现另一个视图控制器以添加注释3)在显示“笔记”视图控制器时将应用程序移至后台。然后将其放回前台。4)该应用程序现已冻结。当连接到调试器时,它似乎被无限期冻结,但是在prod中运行时它将崩溃。 CPU固定为100%,内存使用量正在上升。

我最终将其追溯到我的“便笺”视图中,将其设置为第一响应者,当我的视图出现时,通过override func viewWillAppear(_ animated: Bool)将我将便笺UITextView设置为第一响应者noteTextView.becomeFirstResponder()

如果我删除了该行,但从未点击过note字段,则我的应用将从后台成功恢复。

为了解决此问题,我最终为应用程序移至后台并移至前景时添加了观察者。在这些观察者中,我使注释文本视图分别成为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()
    }

我不确定是否应该采取其他措施来防止此问题,或者,当应用程序进入后台时,最好的方法是辞职第一响应者,但这似乎对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.