我正在使用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中仅更新电子邮件按钮中的电子邮件值,以及密码按钮中的提供者?
3 回答
评论中的这个问题和答案帮助了我 . 由于没有正式回答的问题,我将添加一个更新的代码,因为评论中的一个已被弃用 .
这对我很有用 .
您可以直接导航到要更新的单个值,然后使用setValue(这里给它赋值)这是一个非常简单的示例:
//添加一个更新的按钮名称或whatEver,并将其作为Action连接