我正在使用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];
}
答案 0 :(得分:47)
我的UIViewController
遇到了同样的问题,我只在我的班级let alert = UIAlertView()
中声明变量而没有使用它,它只是在类中作为变量的所有函数。通过删除解决问题。所以,如果您在不使用它或类变量的情况下定义了来自UIAlertView
或UIAlertViewController
的警报,请检查您的课程。
答案 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
你的导航控制器也只是为了理智......