Попытка представить, чье представление не находится в иерархии окон

Я пытаюсь создать класс контроллера предупреждений в быстром

//AppDelegate.swift:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        window = UIWindow(frame:UIScreen.mainScreen().bounds)

        let loginVC = ViewControllerForLogin (nibName:"ViewControllerForLogin", bundle:nil)

        navigationObject = UINavigationController(rootViewController: loginVC)

        window?.rootViewController = loginVC

        window?.makeKeyAndVisible()
        return true
    }

//SPSwiftAlert.swift

class SPSwiftAlert: UIViewController {

    //#MARK: - Members

    internal var defaultTextForNormalAlertButton = "OK"

    static let sharedObject = SPSwiftAlert()

    //#MARK: Functions

    func showNormalAlert(controller: UIViewController, title: String, message: String) {

        // create the alert
        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: defaultTextForNormalAlertButton, style: UIAlertActionStyle.Default, handler: nil))

        // show the alert
        controller.presentViewController(alert, animated: true, completion: nil)

    }    
}

вышеприведенный класс используется для отображения предупреждения с предоставленным сообщением и заголовком с помощью одной кнопки в качестве

 SPSwiftAlert.sharedObject.showNormalAlert(self, title: "Invalid input", message: "Entered email address is not valid")

но это дает мне ошибку времени выполнения как

Attempt to present <UIAlertController: 0x7f8c805e8e80> on <Swaft_Login_Demo.ViewControllerForLogin: 0x7f8c8042d4b0> whose view is not in the window hierarchy!

Как мне это решить?


person Suhas Arvind Patil    schedule 28.04.2016    source источник
comment
Вы пытаетесь представить контроллер представления из уже представленного контроллера представления? SPSwiftAlert уже представлен.   -  person Hasya    schedule 28.04.2016
comment
Нет, все впереди!   -  person Suhas Arvind Patil    schedule 28.04.2016


Ответы (3)


Итак, когда я увидел ваш код, я не понял ту часть, где вы поместили в window.rootViewController свой логинVC вместо навигации.

window?.rootViewController = navigationObject

Затем кажется, что вы не находитесь в иерархии представлений окна, когда вы вызываете свое предупреждение.

Попробуйте записать этот вызов в метод viewDidAppear:.

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        dispatch_async(dispatch_get_main_queue()) {
              SPSwiftAlert.sharedObject.showNormalAlert(self, title: "Invalid input", message: "Entered email address is not valid")
        }
}

ПРИМЕЧАНИЕ. Обычно это происходит, когда мы пытаемся показать (представить/протолкнуть) контроллер представления поверх другого контроллера представления, но контроллер представления презентатора в настоящее время не является активным контроллером представления (означает, что представление контроллера представления презентатора должно быть верхним). посмотреть на экране)

person Alessandro Ornano    schedule 28.04.2016
comment
Я пытаюсь понять, но непонятно, где вы вызываете showNormalAlert, в каком контроллере.. - person Alessandro Ornano; 28.04.2016
comment
да, теперь работает! но почему он не присутствует на самом контроллере? - person Suhas Arvind Patil; 28.04.2016

  1. Во-первых, почему вы не представляете контроллер предупреждений на самом контроллере представления, а не создаете новый контроллер представления и передаете себя (ваш контроллер представления) для отображения предупреждения.
  2. Что касается проблемы, вы никогда не добавляли представление «SPSwiftAlert» ни в какое представление.

// добавить действие (кнопку) alert.addAction(UIAlertAction(title: defaultTextForNormalAlertButton, style: UIAlertActionStyle.Default, handler: nil))

// добавляем представление // добавляем подвид self.view в controller.view

// показать предупреждение self.presentViewController(alert, анимированный: true, завершение: nil)

person sashi_bhushan    schedule 28.04.2016
comment
спасибо за ваш ответ, но проблема была с корневым контроллером. - person Suhas Arvind Patil; 28.04.2016

Я предполагаю, что ваш ViewControllerForLogin уже представлен или у него нет перехода в раскадровке.

person Hasya    schedule 28.04.2016