2015-09-21 3 views
38

Я создаю версию Release Xcode 7.0. Нет раскадровки, просто файлы nib.Попытка загрузить представление контроллера представления во время его освобождения ... UIAlertController

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

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

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

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

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

Я сильно подозреваю, что лет u используют UIAlertController где-то и не осознают этого и не намереваются. Установите точки останова, где вы представляете UIAlertControllers и посмотрите, что происходит – Paulw11

+0

У меня была точка останова, установленная на + [UIAlertController alertControllerWithTitle: message: preferredStyle:], и их не было. Позднее я создал предупреждение, и точка останова работала. – picciano

+0

Вы переопределяете 'dealloc' в любом месте? можете ли вы отправить больше кода? – Nick

ответ

6

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

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

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

+0

В моем случае аналогичная ошибка, отображаемая в консоли в представлении, содержит Mapbox MGLMapView – Nazir

4

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

Дайте мне знать, если это не сработает!

+0

Спасибо, но я не создаю экземпляры 'UIAlertController', но эта ошибка регистрируется на консоли. – picciano

+0

Да, это не просто относится к 'UIAlertController'. Что произойдет, если вы переместите код инициализации вашего представления в 'viewDidAppear'? – Sheamus

+0

Спасибо, что работал в моем случае! – VivienG

0

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

+1

Спасибо, но я не использую наблюдатели кадра. – picciano

46

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

+1

Спасибо, но у меня нет переменных класса 'UIAlertView' или' UIAlertViewController'. – picciano

+0

@picciano, еще раз проверьте где-нибудь, где ваши определения перед просмотром загружаются или что-то ... это сообщение вызвано этим! попробуйте выполнить поиск проекта и отключите любое предупреждение, которое вы используете! У меня была эта ошибка всего несколько дней назад, и я знаю, о чем это! это происходит, когда вы нажимаете контроллер, где объявляется предупреждение. – AaoIi

+0

Спасибо. Вау, это нелогично. Я определил UIAlertView в локальной переменной, а затем не представил его в некоторых случаях. Я не мог узнать, что не так, спасли мой день;) – Laky

0

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

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) 
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"] 
Смежные вопросы

 Смежные вопросы