在执行UIAlertController时获取nil

时间:2016-12-30 11:08:18

标签: ios iphone swift xcode xcode7

我在ViewController中执行UIAlertViewController时遇到问题。

这就是我目前所拥有的

func displayLoginResult(viewModel: Login.PerformLogin.ViewModel) {
    endLoader(loader: loaderLogin)
    if let errorMessage = viewModel.displayedError {
        print(errorMessage.message)

        let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }
    else {
        router.navigateToGroupsScene()
    }
}

我尝试删除DerivedData,但没有。我只考虑viewModel.displayedError不是nil的情况(不是其他情况,只是if)。我已经看过我是否评论过这一行:

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

一切正常,但显然任何Dialog都显示不是我想要的。我有点沮丧,因为我从未遇到过像这样的问题而且Xcode没有提供太多信息。

Xcode上的例外: enter image description here

主题细节: enter image description here

您需要的任何进一步信息,请告诉我,我会为您提供!

非常感谢你。

2 个答案:

答案 0 :(得分:0)

看起来您忘记删除观察者,将此代码添加到您的LoginViewController类:

override func viewDidDisappear(animated: Bool) {
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}

答案 1 :(得分:0)

请尝试使用以下代码:

func displayLoginResult(viewModel: Login.PerformLogin.ViewModel) {
    endLoader(loader: loaderLogin)
    if let errorMessage = viewModel.displayedError {
        print(errorMessage.message)

        let alert = UIAlertController(title: "Error", message: "Enter data in Text fields", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.presentViewController(alert, animated: true, completion: nil)
    })

    }
    else {
        router.navigateToGroupsScene()
    }
}