web-dev-qa-db-ja.com

割り当て解除中にView Controllerのビューをロードしようとしています... UIAlertController

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>)

アプリでUIAlertControllersを使用していますが、このエラーを受け取る前に使用されるものもインスタンス化されるものもありません。これは、iOS 9.0で実行している場合にのみ発生します。 iOS 8.4で実行してもエラーは発生しません。いずれの場合も、アプリは正常に機能しているように見え、ナビゲーションが機能しているように見えます。

エラーは誤解を招くと思われますが、どうすれば修正できますか?

@Nickごとに、使用されているdeallocメソッドは次のとおりです。

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

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

最終的に、サードパーティライブラリMapbox GL内のUIActionSheetクラス変数まで追跡することができました。

その開発チームで問題を開きました: https://github.com/mapbox/mapbox-gl-native/issues/2475

クラス変数としてUIAlertViewを持つことに言及した@Aaoliへの部分的なクレジット(および賛成票と賞金)。

6
picciano

私はUIViewControllerで同じ問題を抱えていましたが、クラスlet alert = UIAlertView()で変数を宣言するだけで、まだ使用せず、変数としてクラス内のすべての関数から外れていました。それを削除することで問題が解決します。そのため、UIAlertViewまたはUIAlertViewControllerからのアラートを、使用せずに、またはクラス変数で定義した場合は、クラスをチェックインしてください。

47
AaoIi

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)
5
Photon Point

これを解決するには、コードの一部をviewDidAppearに移動しました。 UIAlertControllerを使用した場合、あなたが言及したのと同じ問題が発生し、表示されず、同じ方法で解決しました。

うまくいかない場合はお知らせください!

4
Sheamus

私の場合、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"]
1
Naishta

私はnavigationControllerを持たないことでこの問題を抱えていました...明らかなように聞こえますが、さまざまなプロジェクトでUINavigationControllertoの手がありませんでした。あなたもNSLog正気のためにあなたのnavコントローラーにしたいかもしれません...

0
Magoo

UIViewControllerサブクラスのビューで「フレーム」オブザーバーを削除しようとしたときに、同じ問題が発生しました。 isViewLoaded()removeObserverをラップすることにより、この問題を解決しました。正確に何を観察していますか?

0
fruitcoder