试图在释放时加载视图控制器的视图... UIAlertController

Attempting to load the view of a view controller while it is deallocating ... UIAlertController

我正在构建 Xcode 7.0 的发行版。没有故事板,只有 nib 文件。

我有一个 UINavigationController 由应用程序委托创建并使用视图控制器对其进行初始化。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController = [[TGMainViewController alloc] initWithNibName:nil bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.navigationController.navigationBar.hidden = YES;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

使用以下方法导航到新视图后:

TGRoutePreparationViewController *viewController = [[TGRoutePreparationViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:viewController animated:YES];

然后返回使用:

[self.navigationController popViewControllerAnimated:YES];

我收到以下错误:

Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UIAlertController: 0x7b29a600>)

虽然我确实在应用程序中使用了 UIAlertController,但在收到此错误之前使用或实例化了 none。只有在 iOS 9.0 下 运行 时才会发生这种情况。 运行 在 iOS 8.4 下不会产生错误。在所有情况下,应用程序似乎都能正常运行,导航似乎也能正常工作。

我怀疑该错误具有误导性,但我该如何解决这个问题?

Per @Nick,这是正在使用的 dealloc 方法:

- (void)deregisterNotificationHandlers {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)dealloc {
    [self deregisterNotificationHandlers];
}

我通过将一些代码移至 viewDidAppear 解决了这个问题。如果我用UIAlertController,也会出现和你说的一样的问题,不显示,我也是这样解决的

如果这不起作用,请告诉我!

当我试图在 UIViewController 子类的视图中删除 "frame" 观察者时,我遇到了同样的问题。我通过将 removeObserver 包装在 isViewLoaded() 中解决了这个问题。你究竟在观察什么?

我的 UIViewController 也有同样的问题,我只是在我的 class let alert = UIAlertView() 中声明了变量,但还没有使用它,它不在class 作为变量。通过删除解决问题。所以请检查你的 class 如果你已经从 UIAlertViewUIAlertViewController 定义了警告而不使用它或在 class 变量中!

我终于能够追踪到第三方库 Mapbox GL 中的 UIActionSheet class 变量。

我向那个开发团队提出了一个问题:https://github.com/mapbox/mapbox-gl-native/issues/2475

@Aaoli 提到将 UIAlertView 作为 class 变量的部分功劳(以及赞成票和赏金)。

我遇到这个问题是因为没有 navigationController...我知道这听起来很明显但是在各种项目中跳来跳去这个没有 UINavigationController 手....所以其他人来这里你可能也想NSLog你的导航控制器只是为了理智......

我们与 UIAlertController 有同样的问题。

let alert = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {(action : UIAlertAction!) in
                //some actions
                              } ))

我忘记添加以下行了。下面一行解决了这个问题。

self.presentViewController(alert, animated: true, completion: nil)

就我而言,在 Swift 3 中,我在添加操作后错过了下面的代码

presentViewController(theAlert, animated: true, completion: nil)

所以,工作代码如下

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

     if (editingStyle == UITableViewCellEditingStyle.Delete) {

        let title = "Delete ????"
        let message = "Are you sure you want to delete this item?"

        let theAlert = UIAlertController(title: title,
                                   message: message,
                                   preferredStyle: .ActionSheet)

     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
     theAlert.addAction(cancelAction)

     let onDelete = UIAlertAction(title: "Delete", style: .Destructive, handler: { (action) -> Void in
     self.items.removeAtIndex(indexPath.row)
     self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

     })
     theAlert.addAction(onDelete)
        presentViewController(theAlert, animated: true, completion: nil)
     }
     }

//注意我使用的是示例数组

var items = ["iPhone", "iPad", "Mac"]