【问题标题】:iOS 8 Swift 1.2 and Parse - Attempt to present UIAlertController on ViewController whose view is not in the window hierarchyiOS 8 Swift 1.2 和 Parse - 尝试在其视图不在窗口层次结构中的 ViewController 上呈现 UIAlertController
【发布时间】:2015-06-14 17:58:47
【问题描述】:

Stack上有很多关于这个问题的问题,但似乎没有一个能解决我遇到的问题。

我在我的应用程序的登录和注册部分使用 ParseUI。我希望希望在用户(例如)未在用户名和密码字段中输入任何文本时显示UIAlertController

这是我的MasterViewController的代码:

class MasterViewController: UIViewController, PFLogInViewControllerDelegate,
PFSignUpViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        if (PFUser.currentUser() == nil) {
            var logInViewController = LoginViewController()
            logInViewController.delegate = self

            var signUpViewController = SignUpViewController()
            signUpViewController.delegate = self

            logInViewController.signUpController = signUpViewController

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

        }
    }

    func logInViewController(logInController: PFLogInViewController,
        shouldBeginLogInWithUsername username: String, password: String) -> Bool {

            if (!username.isEmpty || !password.isEmpty) {
                return true
            } else {
                let alertController = UIAlertController(title: "Failed to login.",
                    message: "Login Failure.  Please try again.", preferredStyle: .Alert)

                let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
                alertController.addAction(defaultAction)

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


                return false
            }
    }



    func logInViewController(logInController: PFLogInViewController,
        didFailToLogInWithError error: NSError?) {

            println("Failed to log in.")

    }


    func signUpViewController(signUpController: PFSignUpViewController,
        shouldBeginSignUp info: [NSObject : AnyObject]) -> Bool {

            if let password = info["password"] as? String {
                return count(password.utf16) >= 8
            } else {
                return false
            }
    }

    func signUpViewController(signUpController: PFSignUpViewController,
        didFailToSignUpWithError error: NSError?) {

            println("Failed to sign up.")

    }

    func logInViewController(logInController: PFLogInViewController,
        didLogInUser user: PFUser) {
            let installation = PFInstallation.currentInstallation()
            installation["user"] = PFUser.currentUser()
            installation.saveInBackground()
            self.dismissViewControllerAnimated(true, completion: nil)
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func signUpViewControllerDidCancelSignUp(signUpController:
        PFSignUpViewController) {

            println("User dismissed signup.")

    }
}

在阅读了另一个用户的答案后,我在我的工作区中添加了以下类:

import Foundation

class AlertHelper: NSObject {
    func showAlert(fromController controller: MasterViewController) {
        var alert = UIAlertController(title: "abc", message: "def", preferredStyle: .Alert)
        controller.presentViewController(alert, animated: true, completion: nil)
    }
}

然后相应地修改了我的方法:

func logInViewController(logInController: PFLogInViewController, shouldBeginLogInWithUsername 用户名:String,密码:String) -> Bool {

    if (!username.isEmpty || !password.isEmpty) {
        return true
    } else {
        let alertController = UIAlertController(title: "Failed to login.",
            message: "Login Failure.  Please try again.", preferredStyle: .Alert)

        let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
        alertController.addAction(defaultAction)

        var alert = AlertHelper()
        alert.showAlert(fromController: self)

        return false
    }

}

在这一点上,我不太确定还能做什么。我的一个想法是以编程方式将UILabel 添加到我的LoginViewControllerSignUpViewController 并根据用户登录和注册的错误(或缺少错误)更改内容,但我想收到警报。

编辑:这是我的LoginViewController 中的代码。它子类化以自定义外观。我的SignUpViewController 的代码几乎相同。

导入 UIKit 导入解析 导入 ParseUI

class LoginViewController: PFLogInViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = ckPurple

    let label = UILabel()
    label.textColor = UIColor.whiteColor()
    label.text = "Welcome."
    label.sizeToFit()
    logInView?.logo = label

    // Do any additional setup after loading the view.
  }

【问题讨论】:

    标签: ios objective-c swift parse-platform ios8


    【解决方案1】:

    问题是你从你的主视图控制器中展示了一个登录视图控制器,它从视图层次结构中删除了主视图控制器。然后,您尝试从主视图控制器呈现警报视图控制器,但您需要从视图层次结构中的视图控制器呈现。尝试从您的登录视图控制器显示警报

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

    【讨论】:

    • 您的答案非常接近。相反,它是loginController.presentViewController(alertController, animated: true, completion: nil)(在注册的情况下,它是signUpController,因为我必须在委托方法中引用PFLoginViewController 和PFSignupViewController`。
    • 好的,我将loginViewController 更改为loginController。很高兴我的回答对您有所帮助,请考虑将其标记为正确。
    猜你喜欢
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2019-12-25
    • 2023-03-31
    • 2018-06-06
    • 1970-01-01
    • 2017-04-01
    • 2015-09-17
    相关资源
    最近更新 更多