расширение UIAlertController удобство инициализации предупреждение

Когда я определяю инициализатор удобства UIAlertController :

 extension UIAlertController { convenience init(message: String?) { self.init(title: nil, message: message, preferredStyle: .Alert) self.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) } } 

и использовать его в действии кнопки в моем подклассе UIViewController :

 func buttonAction(button: UIButton) { let alert = UIAlertController(dictionary: nil, error: nil, handler: nil) presentViewController(alert, animated: true, completion: nil) } 

и нажмите эту кнопку на Симуляторе, я получаю предупреждение:

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

Тем не менее, я не получаю предупреждение, если вместо инициализатора удобства я использую глобальную функцию:

 func UIAlertControllerWithDictionary(message: String?) -> UIAlertController { let alert = UIAlertController(title: nil, message: message, preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) return alert } 

Я сообщил об этом Apple в качестве ошибки SDK для iOS.

До тех пор, пока он не будет исправлен, нормально ли игнорировать предупреждение и использовать инициализатор удобства?

2 Solutions collect form web for “расширение UIAlertController удобство инициализации предупреждение”

Я заметил ту же проблему с инициализаторами удобства. На самом деле это две ошибки сразу.

  1. Swift выделяет экземпляр UIAlertController .
  2. Swift вызывает ваше удобство init с экземпляром, созданным Swift.
  3. Там вы называете UIKit удобством init, который на самом деле является заводским методом Objective-C +(id) alertControllerWithTitle:message:preferredStyle:
  4. Там UIKit выделяет свой собственный экземпляр UIAlertController . (Ошибка № 1)
  5. UIKit устанавливает свой собственный экземпляр.
  6. UIKit освобождает ваш экземпляр Swift.
  7. UIAlertController (dealloc) обращается к свойству view которое приводит к сообщению журнала. (Ошибка № 2)
  8. UIAlertController управления возвращается к вашему собственному удобству init, где self изменений изменился с экземпляра UIAlertController от Swift UIAlertController экземпляра UIKit.
  9. Все, что вы делаете сейчас, происходит на экземпляре, созданном UIKit, который в порядке.

Таким образом, первая ошибка заключается в том, что Swift создает временный UIAlertController который уничтожается без использования.

Вторая ошибка заключается в том, что UIViewController обращается к свойству представления во время деинициализации, чего он не должен.


Что касается вашего вопроса:
Обе ошибки не должны быть проблематичными, поэтому мы можем просто игнорировать это предупреждение. Я тоже это делаю, и проблем не было – просто это предупреждение в журнале.

Я также столкнулся с той же проблемой

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

Поэтому я перешел к альтернативному пути для этого.

  import UIKit import Foundation //the show alert function for failure func showAlertforNetworkFailure(alerttitle :String, alertmessage: String,ButtonTitle: String, viewController: UIViewController) { let alertController = UIAlertController(title: alerttitle, message: alertmessage, preferredStyle: .Alert) let okButtonOnAlertAction = UIAlertAction(title: ButtonTitle, style: .Default) { (action) -> Void in //what happens when "ok" is pressed } alertController.addAction(okButtonOnAlertAction) alertController.show() } // function for show alert in Main View Controller extension UIAlertController { func show() { present(true, completion: nil) } func present(animated: Bool, completion: (() -> Void)?) { if let rootVC = UIApplication.sharedApplication().keyWindow?.rootViewController { presentFromController(rootVC, animated: animated, completion: completion) } } private func presentFromController(controller: UIViewController, animated: Bool, completion: (() -> Void)?) { if let navVC = controller as? UINavigationController, let visibleVC = navVC.visibleViewController { presentFromController(visibleVC, animated: animated, completion: completion) } else { controller.presentViewController(self, animated: animated, completion: completion); } } } 

вызовите этот метод в вашем ViewController как

 showAlertforNetworkFailure("Server Error!!!", alertmessage: "Server does not responding,please Try in later.", ButtonTitle: "Okay", viewController: self) 
  • UIPopover Как сделать popover с такими кнопками?
  • Совместимость с UIAlertView / UIAlertController iOS 7 и iOS 8
  • Как изменить цвет текста кнопки UIAlertController в iOS9?
  • Возможно ли заблокировать выполнение моего кода до тех пор, пока UIAlertController не будет уволен?
  • Утечки с UIAlertController
  • Функция кнопки UIAlertController не работает
  • Проверка на UIAlertController TextField для включения кнопки
  • Как использовать UITextView в UIAlertController
  • Как я могу отобразить всплывающее сообщение в Swift, которое исчезает через 3 секунды или может быть отменено пользователем немедленно?
  • Как иметь цифровую панель в текстовом поле контроллера предупреждения
  • Добавление изображения в UIAlertController
  • Interesting Posts

    Xamarin Forms iOS – PickerView с выбором нескольких строк

    Swift3 iOS -Firebase FIREmailPasswordAuthProvider не работает

    Parse.com Как узнать, не содержит ли массив объект

    Подождите, пока NSURLConnection sendAsynchronousRequest не будет завершен

    Как отключить UITableViewCell, но все еще есть взаимодействия с аксессуарами (например, UISwitch)

    PullToRefresh TableView внутри UIViewController

    Collection View Cell multiple item select Error

    Издевательские объекты с автоматизацией пользовательского интерфейса Xcode 7

    Как я могу связать основные анимации для разных слоев один за другим?

    Почему я не могу ссылаться на Рика Астли в iOS?

    Установите две версии одного и того же приложения iOS.

    Лучший способ представления макетов с относительными позициями в iOS?

    Каковы некоторые из лучших способов оптимизации приложения Titanium?

    Соединительный слайдер для просмотра – Swift

    Использование функций iOS 5 без нарушения обратной совместимости

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.