расширение 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) 
  • Как создать UIActionSheet или UIAlertController (UIAlertControllerStyleActionSheet), например, Apple Music?
  • UIAlertController, если iOS 8, в противном случае UIAlertView
  • Как добавить индикатор выполнения в UIAlertController?
  • Отключить параллакс iOS в UIAlertController
  • Написание обработчика для UIAlertAction
  • Что может привести к тому, что действия UIAlertController никогда не будут вызваны?
  • Swift Делегат возвращает ноль
  • Как добавить ввод текста в alertview ios 8?
  • UIAlertController занимает 15 секунд для отображения при добавлении текстового поля
  • iOS 8.3 Сбой в UIAlertController при попытке добавить текстовое поле
  • Как скрыть кадр заголовка / сообщения в UIAlertController?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.