Xcode 7.0のリリースバージョンでビルドしています。ストーリーボードはなく、ペン先ファイルのみ。
アプリデリゲートによって作成された単一のUINavigationController
があり、それをView Controllerで初期化します。
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
sを使用していますが、このエラーを受け取る前に使用されるものもインスタンス化されるものもありません。これは、iOS 9.0で実行している場合にのみ発生します。 iOS 8.4で実行してもエラーは発生しません。いずれの場合も、アプリは正常に機能しているように見え、ナビゲーションが機能しているように見えます。
エラーは誤解を招くと思われますが、どうすれば修正できますか?
@Nickごとに、使用されているdeallocメソッドは次のとおりです。
- (void)deregisterNotificationHandlers {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)dealloc {
[self deregisterNotificationHandlers];
}
最終的に、サードパーティライブラリMapbox GL内のUIActionSheet
クラス変数まで追跡することができました。
その開発チームで問題を開きました: https://github.com/mapbox/mapbox-gl-native/issues/2475
クラス変数としてUIAlertView
を持つことに言及した@Aaoliへの部分的なクレジット(および賛成票と賞金)。
私はUIViewController
で同じ問題を抱えていましたが、クラスlet alert = UIAlertView()
で変数を宣言するだけで、まだ使用せず、変数としてクラス内のすべての関数から外れていました。それを削除することで問題が解決します。そのため、UIAlertView
またはUIAlertViewController
からのアラートを、使用せずに、またはクラス変数で定義した場合は、クラスをチェックインしてください。
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)
これを解決するには、コードの一部をviewDidAppear
に移動しました。 UIAlertController
を使用した場合、あなたが言及したのと同じ問題が発生し、表示されず、同じ方法で解決しました。
うまくいかない場合はお知らせください!
私の場合、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"]
私はnavigationController
を持たないことでこの問題を抱えていました...明らかなように聞こえますが、さまざまなプロジェクトでUINavigationController
toの手がありませんでした。あなたもNSLog
正気のためにあなたのnavコントローラーにしたいかもしれません...
UIViewController
サブクラスのビューで「フレーム」オブザーバーを削除しようとしたときに、同じ問題が発生しました。 isViewLoaded()
でremoveObserver
をラップすることにより、この問題を解決しました。正確に何を観察していますか?