У меня была та же проблема, я решил ее в своем случае, просто вернув alertController в синглтон, а затем представив его там.
В классе AlertView у меня есть приведенный ниже код для простого предупреждения, которое может принимать заголовок и сообщение в качестве входных данных и отображать только одну кнопку OK, чтобы отклонить предупреждение:
func alert(#alertTitle: String, alertMessage: String) -> UIAlertController {
var alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .Alert)
var okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertController.addAction(okButton)
return alertController
}
Обратите внимание, что в приведенном выше методе я не представляю контроллер предупреждений в представлении, а просто возвращаю его тому, кто когда-либо вызывал метод.
Затем в классе, где я вызвал метод, я делаю следующий код:
** Просто обратите внимание, что класс, в котором я вызываю предупреждение, является ViewController в Objective-C. Я также предоставлю быстрый код ниже **
// Creating an instance of the AlertView class and initializing it
AlertView *testAlert = [[AlertView alloc] init];
/* Creating a UIAlertController object and then calling the method I created in the AlertView class. This way the returned UIAlertController will be assigned to this UIAlertController
*/
UIAlertController *alertController = [testAlert alertWithAlertTitle:@"Genius!" alertMessage:@"Pure Genius"];
// Finally presenting the alert controller
[self presentViewController:alertController animated:true completion:nil];
ПРИМЕЧАНИЕ: я обнаружил, что вам нужно делать это вне ViewDidLoad. Это не работает в ViewDidLoad и дает следующую ошибку:
Attempt to present <UIAlertController: 0x1555118f0> on <ViewController: 0x155509790> whose view is not in the window hierarchy!
Вместо этого вы можете сделать это в методе viewDidAppear.
Теперь быстрая версия ViewController:
// Created a function to show the alert
func showAlert() {
// Creating an instance of the AlertView class and initializing it
var testAlert : AlertView = AlertView()
/* Creating a UIAlertController object and then calling the method I created in the AlertView class. This way the returned UIAlertController will be assigned to this UIAlertController
*/
var alertController : UIAlertController = testAlert.alert(alertTitle: "Genius", alertMessage: "Pure Genius")
// Finally presenting the alert controller
self.presentViewController(alertController, animated: true, completion: nil)
}
Еще одна вещь, если вы пытаетесь показать это предупреждение в синглтоне за пределами ViewController, тогда вы можете получить контроллер верхнего вида, как показано ниже, а затем представить ему контроллер предупреждения:
Цель - С:
UIViewController *topViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[topViewController presentViewController:alertController animated:true completion:nil];
Быстрый:
if let topViewController = UIApplication.sharedApplication().keyWindow?.rootViewController? {
topViewController.presentViewController(alertController, animated: true, completion: nil)
}
person
Taha Abbasi
schedule
25.06.2015