在取消分配时尝试加载视图控制器的视图... UIAlertController

时间:2015-09-21 20:38:51

标签: ios swift xcode xcode7 mapbox-gl

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

我有一个由app delegate创建的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,但在收到此错误之前没有使用或实例化。这仅在iOS 9.0下运行时才会发生。在iOS 8.4下运行不会产生错误。在所有情况下,应用程序似乎正常运行,导航似乎正在运行。

我怀疑错误是误导性的,但我该如何解决?

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

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

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

7 个答案:

答案 0 :(得分:47)

我的UIViewController遇到了同样的问题,我只在我的班级let alert = UIAlertView()中声明变量而没有使用它,它只是在类中作为变量的所有函数。通过删除解决问题。所以,如果您在不使用它或类变量的情况下定义了来自UIAlertViewUIAlertViewController的警报,请检查您的课程。

答案 1 :(得分:6)

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

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

@Aaoli提及将UIAlertView作为类变量的部分功劳(以及投票和赏金)。

答案 2 :(得分:5)

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)

答案 3 :(得分:4)

我通过将部分代码移到viewDidAppear来解决这个问题。如果我使用UIAlertController,它会导致您提到的相同问题,并且不会显示,我也以同样的方式解决了。

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

答案 4 :(得分:1)

就我而言,在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"]

答案 5 :(得分:0)

当我试图移除&#34;框架时,我遇到了同样的问题。观察者在我UIViewController子类中的视图。我将removeObserver包裹在isViewLoaded()中解决了这个问题。你究竟在观察什么?

答案 6 :(得分:0)

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