【发布时间】:2016-08-25 15:44:30
【问题描述】:
我正在使用 swift 和 firebase 开发 iOS 应用程序。 我试图让用户使用单独的按钮更改他的电子邮件和密码以及存储在同一视图控制器中的 firebase 中的其余信息。
以下是仪表板中一位用户的示例:
{
"Users" : {
"08e5443c-cdde-4fda-8733-8c4fce75dd34" : {
"BusinessName" : "looliCake",
"Category" : "Cooking",
"City" : "Riyadh",
"ContactMe" : "05551233210",
"Details" : "many flaiver choose",
"Email" : "loolicack@gmail.com",
"PhoneNumber" : "05551233210",
"Provider" : "123",
"ShortDescription" : "best pop cake ever . ",
"Website1" : "www.looliCack.com",
"Website2" : "https://www.instagram.com/loolicack/"
}
}
}
代码如下:
let mainpass = NSUserDefaults.standardUserDefaults().objectForKey("password") as? String
let mainEmail = NSUserDefaults.standardUserDefaults().objectForKey("Email") as? String
@IBAction func EditEmail(sender: AnyObject) {
if EmailAddressTF.text==""
{
let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
}
else
{
let isEqu = (mainEmail == self.EmailAddressTF.text)
if(isEqu == true) {
} else {
let ref = Firebase(url: "https://businesswallet.firebaseio.com/")
ref.changeEmailForUser(mainEmail, password: mainpass, toNewEmail: self.EmailAddressTF.text, withCompletionBlock: { error in
if error != nil {
if let errorCode = FAuthenticationError(rawValue: error.code) {
switch (errorCode) {
case .EmailTaken:
print("Email taken")
let alert = UIAlertController(title: "Oops!", message:"Sorry,Email taken", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
case .InvalidEmail:
print("invalid email")
let alert = UIAlertController(title: "Oops!", message:"invalid email", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
case .NetworkError:
print("Network Error")
let alert = UIAlertController(title: "Oops!", message:"Network error, check your connection", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
default:
print("Unknown Error")
let alert = UIAlertController(title: "Oops!", message:"Unknown Error", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
}
}
} else {
NSUserDefaults.standardUserDefaults().setValue(self.EmailAddressTF.text, forKey: "Email")
print("Email changed successfully")
let newUser = [
"Provider": self.PasswordTF.text!,
"Email": self.EmailAddressTF.text,
"BusinessName": self.BusinessNameTF.text ,
"ShortDescription" : self.ShortDescriptionTF.text,
"Category" : self.itemSelected,
"City" : self.CityTF.text,
"ContactMe" : self.ContactMeTF.text,
"PhoneNumber" : self.PhoneNumberTF.text,
"Website1": self.Website1TF.text,
"Website2": self.Website2TF.text,
"Details": self.DetailsTV.text
]
self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
self.navigationController?.popViewControllerAnimated(true)
}
})
} //Big Else
}
} //EditEmailButton
@IBAction func EditPassword(sender: AnyObject) {
if PasswordTF.text==""
{
let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
}
else
{
if RepasswordTF.text != PasswordTF.text
{
let alert = UIAlertController(title: "Oops!", message:"You Entered Different Passwords", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
}
else {
ref.changePasswordForUser( NSUserDefaults.standardUserDefaults().objectForKey("Email") as? String, fromOld: NSUserDefaults.standardUserDefaults().objectForKey("password") as? String, toNew: self.PasswordTF.text)
{
(ErrorType) -> Void in
if ErrorType != nil {
print(ErrorType)
print("There was an error processing the request")
}
else
{
NSUserDefaults.standardUserDefaults().setValue(self.PasswordTF.text, forKey: "password")
print("Password changed successfully")
}
}
let newUser = [
"Provider": self.PasswordTF.text!,
"Email": self.EmailAddressTF.text,
"BusinessName": self.BusinessNameTF.text ,
"ShortDescription" : self.ShortDescriptionTF.text,
"Category" : self.itemSelected,
"City" : self.CityTF.text,
"ContactMe" : self.ContactMeTF.text,
"PhoneNumber" : self.PhoneNumberTF.text,
"Website1": self.Website1TF.text,
"Website2": self.Website2TF.text,
"Details": self.DetailsTV.text
]
self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
self.navigationController?.popViewControllerAnimated(true)
}
} //else
}
@IBAction func EditBusinessInfo(sender: AnyObject) {
if BusinessNameTF.text==""
{
let alert = UIAlertController(title: "Oops!", message:"Make sure to fill in all required textfields", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default) { _ in })
self.presentViewController(alert, animated: true){}
}
else
{
let newUser = [
"Provider": self.PasswordTF.text!,
"Email": self.EmailAddressTF.text,
"BusinessName": self.BusinessNameTF.text ,
"ShortDescription" : self.ShortDescriptionTF.text,
"Category" : self.itemSelected,
"City" : self.CityTF.text,
"ContactMe" : self.ContactMeTF.text,
"PhoneNumber" : self.PhoneNumberTF.text,
"Website1": self.Website1TF.text,
"Website2": self.Website2TF.text,
"Details": self.DetailsTV.text
]
self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(newUser)
self.navigationController?.popViewControllerAnimated(true)
}
}
在每个按钮中,我都在更新 firebase 中的整个字典!哪里不对!
如何在 firebase 中仅更新电子邮件按钮中的电子邮件值, 和密码按钮中的提供者?
【问题讨论】:
-
我确实通过添加解决了这个问题: self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(["Email":self.EmailAddressTF.text !]) 在电子邮件按钮而不是字典中。
-
并在密码中添加:self.ref.childByAppendingPath("Users").childByAppendingPath(self.ref.authData.uid).updateChildValues(["Provider":self.PasswordTF.text!])按钮而不是字典。
标签: ios swift dictionary firebase