gpt4 book ai didi

ios - 当包含 firebase 时,其 View 不在窗口层次结构中的 LoginViewController 上的 UIAlertController

转载 作者:行者123 更新时间:2023-11-28 08:44:48 33 4
gpt4 key购买 nike

嗨,每当我输入在 Firebase 数据库中检查的错误登录信息详细信息时,我想显示一个警报 Controller 以阻止它进入应用程序。但是我收到一条错误消息,说 alertviewcontroller 不是窗口层次结构。当我在 firebase 数据 block 之外调用该函数时,我没有收到该错误。有人可以解释如何解决这个问题吗?

{
import UIKit
import Firebase

class LoginViewController: UIViewController {

let BASE_REF = Firebase(url: "https://cal-sap.firebaseio.com/?page=Auth")
let USER_REF = Firebase(url: "https://cal-sap.firebaseio.com/?page=Auth/users")

let gradientLayer = CAGradientLayer()
@IBOutlet weak var Email: UITextField!
@IBOutlet weak var Password: UITextField!

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
/*let defaults = NSUserDefaults.standardUserDefaults()
let name = defaults.stringArrayForKey("uid")
if name != nil && USER_REF.authData.uid != nil {
self.performSegueWithIdentifier("LoggedinView", sender: self)
print(name);
}
*/
if NSUserDefaults.standardUserDefaults().valueForKey("uid") != nil && DataService.dataService.CURRENT_USER_REF.authData != nil {
self.performSegueWithIdentifier("LoggedinView", sender: nil)
}

}

override func viewDidLoad() {
super.viewDidLoad()

self.view.backgroundColor = UIColor.grayColor()

gradientLayer.frame = self.view.bounds


let color1 = UIColor(red: (69/255.0), green: (69/255.0), blue:(69/255.0), alpha: 0.05).CGColor as CGColorRef
let color2 = UIColor(red: (71/255.0), green: (71/255.0), blue:(71/255.0), alpha: 0.05).CGColor as CGColorRef
let color3 = UIColor(red: (200/255.0), green: (200/255.0), blue:(200/255.0), alpha: 0.05).CGColor as CGColorRef
let color4 = UIColor.whiteColor().CGColor as CGColorRef
gradientLayer.colors = [color1,color2,color3,color4]

gradientLayer.locations = [0.0,0.25,0.75,1.0]


self.view.layer.addSublayer(gradientLayer)

let userimageView = UIImageView();
let userimage = UIImage(named: "Email.png");
userimageView.image = userimage;
Email.leftView = userimageView
Email.leftViewMode = UITextFieldViewMode.Always
userimageView.frame = CGRectMake(20, 10, 15, 20)

let passimageView = UIImageView();
let passimage = UIImage(named: "lock.png");
passimageView.image = passimage;
Password.leftView = passimageView
Password.leftViewMode = UITextFieldViewMode.Always
passimageView.frame = CGRectMake(15, 10, 15, 20)


// Do any additional setup after loading the view.


}

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


}


@IBAction func LoginButtonTapped(sender: AnyObject) {



if(Email != "" || Password != ""){
/*USER_REF.authUser(Email.text, password:Password.text) {
error, authData in
if error != nil {
self.displayAlertMessage("Information not valid. Please enter again.");
print("user not defined");
} else {
NSUserDefaults.standardUserDefaults().setValue(authData.uid, forKey: "uid")
}
}
*/
DataService.dataService.BASE_REF.authUser(Email.text, password: Password.text, withCompletionBlock: { error, authData in

if error != nil {
print(error)
self.displayAlertMessage("Information invalid. Please enter again.")
} else {

// Be sure the correct uid is stored.

NSUserDefaults.standardUserDefaults().setValue(authData.uid, forKey: "uid")

// Enter the app!

self.performSegueWithIdentifier("CurrentlyLoggedIn", sender: nil)
}
})
}
else{
self.displayAlertMessage("Please fill all the fields")
}
}

func displayAlertMessage(usermessage: String)
{
let MyAlert = UIAlertController(title: "Alert", message: usermessage, preferredStyle: UIAlertControllerStyle.Alert)

let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)

MyAlert.addAction(okAction)

self.presentViewController(MyAlert, animated: true, completion: nil)
}


}
}

#DataService.swift 文件

{
import Foundation
import Firebase

class DataService {
static let dataService = DataService()

private var _BASE_REF = Firebase(url: "https://cal-sap.firebaseio.com/?page=Auth")
private var _USER_REF = Firebase(url: "https://cal-sap.firebaseio.com/?page=Auth/users")
private var _EVENT_REF = Firebase(url: "https://cal-sap.firebaseio.com/?page=Auth/users/events")

var BASE_REF: Firebase {
return _BASE_REF
}

var USER_REF: Firebase {
return _USER_REF
}

var CURRENT_USER_REF: Firebase {
let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String

let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID)

return currentUser!
}

var EVENT_REF: Firebase {
return _EVENT_REF
}


}
}

最佳答案

如果你必须处理异步 block 中的 UI 元素,你必须在主队列中进行:

dispatch_async(dispatch_get_main_queue(), { [weak self] () -> Void in
self?.presentViewController(MyAlert, animated: true, completion: nil)
})

我认为这会解决您的问题,但对于警报,我总是使用这些实用程序变量:

public var APP_KEY_WINDOW: UIWindow? { get { return UIApplication.sharedApplication().keyWindow } }
public var APP_ROOT_VC: UIViewController? {
get {
guard let root = APP_KEY_WINDOW?.rootViewController else { return nil }
guard root.isViewLoaded() && root.view.window != nil else {
guard let presentedVC = root.presentedViewController else { return nil }
return presentedVC
}
return root
}
}

如下:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
APP_ROOT_VC?.presentViewController(MyAlert, animated: true, completion: nil)
})

关于ios - 当包含 firebase 时,其 View 不在窗口层次结构中的 LoginViewController 上的 UIAlertController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599156/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com