2015-06-14 58 views
1

Stack在这个问题上有很多问题,但他们都没有解决我遇到的问题。iOS 8 Swift 1.2 and Parse - 尝试在ViewController上呈现UIAlertController,它的视图不在窗口层次结构中

我使用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, shouldBegin LogInWithUsername用户名:字符串,密码:字符串) - >布尔{

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. 
    } 

回答

1

的问题是,你从你的主视图控制器,它从视图中删除层次结构的主视图控制器呈现登录视图控制器。然后尝试从主视图控制器呈现警报视图控制器,但是您需要从视图层次结构中的视图控制器呈现。尝试使用您的登录视图控制器代替提示

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

您的回答非常接近。相反,它是'loginController.presentViewController(alertController,animated:true,completion:nil)'(在注册的情况下,它是'signUpController',因为我必须在委托方法中引用'PFLoginViewController'和PFSignupViewController'。 – damianesteban

+0

好的,我把'loginViewController'改为'loginController'。很高兴我的回答对你有帮助,请考虑标记为正确。 – johnpatrickmorgan

相关问题