2015-02-04 2 views
0

Я искал много учебников по UIAlertController. До сих пор способ, которым я нашел, - активировать UIAlertController, связав его с кнопкой или меткой, а затем вызвать IBAction.Как мы создаем и отклоняем UIAlertController без ввода пользователем? (Swift)

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

Warning: Attempt to present UIAlertController on MainViewController whose view is not in the window hierarchy!

Затем я попытался добавить UIAlertController к MainViewController через addChildViewController и addSubview. Тем не менее, я получаю ошибку:

Application tried to present modally an active controller

Я понял, что я не могу использовать функцию presentViewController и прокомментировал его.

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

Trying to dismiss UIAlertController with unknown presenter.

Я действительно в тупике. Может ли кто-то поделиться тем, что я делаю неправильно? Огромное спасибо. Вот код.

func displayTutorial() { 

    alertController = UIAlertController(title: NSLocalizedString("tutorialAlert", comment: ""), message: NSLocalizedString("tutorialMsg", comment: ""), preferredStyle: .ActionSheet) 

    self.addChildViewController(alertController) 
    self.view.addSubview(alertController.view) 
    alertController.didMoveToParentViewController(self) 
    alertController.view.frame.origin.x = self.view.frame.midX 
    alertController.view.frame.origin.y = self.view.frame.midY 
    //alertController.popoverPresentationController?.sourceView = self.view*/ 


    let OkAction = UIAlertAction(title: NSLocalizedString("yesh", comment: ""), style: .Destructive) { (action) in 

    } 
    alertController.addAction(OkAction) 

    let cancelAction = UIAlertAction(title: NSLocalizedString("notNow", comment: ""), style: .Destructive) { (action) in 
     //println(action) 
     self.tutorial = 1 
     self.presentedViewController?.dismissViewControllerAnimated(true, completion: nil) 
    } 

    alertController.addAction(cancelAction) 

    let neverAction = UIAlertAction(title: NSLocalizedString("never", comment: ""), style: .Cancel) { (action) in 
     self.tutorial = 1 
    } 
    alertController.addAction(neverAction) 


    //self.presentViewController(alertController, animated: false) {} 

} 

ответ

0

Я нашел решение. По-видимому, я не могу вызвать UIAlertController из func viewDidLoad. Я должен вызвать функцию из viewDidAppear. Так что мой код теперь

override func viewDidAppear(animated: Bool) { 
    if tutorial == 0 { 
     displayTutorial(self.view) 
    } 
} 

func displayTutorial(sender:AnyObject) { 

    let alertController = UIAlertController(title: NSLocalizedString("tutorialAlert", comment: ""), message: NSLocalizedString("tutorialMsg", comment: ""), preferredStyle: .ActionSheet) 


    let OkAction = UIAlertAction(title: NSLocalizedString("yesh", comment: ""), style: .Destructive) { (action) in 

    } 
    alertController.addAction(OkAction) 

    let cancelAction = UIAlertAction(title: NSLocalizedString("notNow", comment: ""), style: .Default) { (action) in 
     //println(action) 
     self.tutorial = 1 
     self.presentedViewController?.dismissViewControllerAnimated(true, completion: nil) 
    } 

    alertController.addAction(cancelAction) 

    let neverAction = UIAlertAction(title: NSLocalizedString("never", comment: ""), style: .Cancel) { (action) in 
     self.tutorial = 1 
    } 
    alertController.addAction(neverAction) 

    self.presentViewController(alertController, animated: true, completion: nil) 

    if let pop = alertController.popoverPresentationController { 
     let v = sender as UIView 
     pop.sourceView = view 
     pop.sourceRect = v.bounds 
    } 
} 

Благодаря этой публикации: Warning: Attempt to present * on * whose view is not in the window hierarchy - swift