Подтвердить что ты не робот

Попытка загрузить представление контроллера просмотра во время его освобождения... UIAlertController

Я создаю версию Release 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 в приложении, ни один из них не используется или не создается, прежде чем получать эту ошибку. Это происходит только при работе под iOS 9.0. Запуск под iOS 8.4 не вызывает ошибок. Во всех случаях приложение работает нормально, и навигация работает.

Я подозреваю, что ошибка вводит в заблуждение, но как я могу это исправить?

Per @Nick, здесь используется метод dealloc:

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

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

Ответ 1

Наконец, я смог отследить его до переменной класса UIActionSheet внутри сторонней библиотеки Mapbox GL.

Я открыл проблему с этой командой разработчиков: https://github.com/mapbox/mapbox-gl-native/issues/2475

Частичный кредит (и голосу и щедрость) на @Aaoli за упоминание наличия UIAlertView в качестве переменной класса.

Ответ 2

У меня была такая же проблема с моим UIViewController, где я только объявлял переменную в моем классе let alert = UIAlertView(), но не использовал ее, она была вне всех функций, находящихся внутри класса как переменная. путем удаления, что решает проблему. поэтому, пожалуйста, проверьте свой класс, если вы определили оповещение от UIAlertView или UIAlertViewController, как это, не используя его или в переменной класса!

Ответ 3

Я решил это, переместив часть моего кода на viewDidAppear. Если бы я использовал UIAlertController, это вызовет ту же проблему, о которой вы говорили, и не будет отображаться, и я решил ее так же.

Сообщите мне, если это не сработает!

Ответ 4

У нас была та же проблема с 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

В моем случае, в 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"]

Ответ 6

У меня была такая же проблема, когда я попытался удалить наблюдателя "frame" на моем представлении в подклассе UIViewController. Я решил эту проблему, обернув removeObserver в isViewLoaded(). Что именно вы наблюдаете?

Ответ 7

У меня была эта проблема, не имея navigationController... Я знаю, что это кажется очевидным, но в разных проектах он прыгает, у этого не было UINavigationController, чтобы передать... так что другие приходят сюда, вы могли бы хотите, чтобы NSLog ваш навигационный контроллер просто для здравомыслия тоже...