2017-08-26 5 views
1

現在の私のiOSでは、ユーザーがサインアップしてログインする必要があり、ユーザーがそこにログインすると、データはuser.uidとサインアップされた電子メールアドレスでデータベースに表示されます。ユーザーがログインすると、特定のuser.uidノードにデータを格納できるようにしたいと考えています。たとえば、「User A」がログインしていて何らかのデータを入力した場合、そのユーザーの直下にデータを保存する必要があります(各ユーザーにはそれぞれ独自のデータが含まれている必要があります。他のユーザのデータは所有しています)。だから私の質問は、ログインしているユーザーを追跡したり、ログインしているユーザーにアクセスして、後で参照コントローラをログインしたコントローラの外のビューコントローラに保存する最善の方法は何ですか?これは食料配送アプリなので、ユーザーがログインすると、今後入力するすべてのデータをデータベース内のそのユーザーの下に保存したかったのです。ログインコントローラのfirebaseデータベースの特定の使用参照にデータを追加するには?

コード:

import UIKit 
import FirebaseDatabase 
import FirebaseAuth 

class LogInController: UIViewController { 

var ref: DatabaseReference! 


@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 


func placeholders() { 
    emailField.placeholder = "Enter Email" 
    passwordField.placeholder = "Enter Password" 
} 






@IBAction func loginButton(_ sender: AnyObject) { 

    Auth.auth().signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in 




     let userID: String = (user?.uid)! 
     let userEmail: String = self.emailField.text! 

     self.ref.child("Users/\(userID)").setValue(userEmail) 




     if error != nil { 
      print(error?.localizedDescription as Any) 
     } 

     else { 
      print("User logged in with UserID of: " + (user?.uid)!) 
     } 
     }) 
    performSegue(withIdentifier: "signedIn", sender: self) 


} 



@IBAction func signoutButton(_ sender: Any) { 
    print("User has logged out...") 
    try! Auth.auth().signOut() 
} 



@IBAction func registerButton(_ sender: AnyObject) { 

    Auth.auth().createUser(withEmail: emailField.text!, password: passwordField.text!, completion: { (user, error) in 

     if error != nil { 
      print(error?.localizedDescription as Any) 
      return 
     } 

      print("User created with UserId of: " + (user?.uid)!) 


    }) 
} 



override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let flavorsVC = segue.destination as? FlavorsController { 
     flavorsVC.ref = ref 
     let userEmail = emailField.text 
     flavorsVC.email = userEmail! 

    } 
} 







override func viewDidLoad() { 
    super.viewDidLoad() 


    placeholders() 
    ref = Database.database().reference() 

} 

だから、もう一度、ユーザーがログインした後、私が望むすべてのデータは、単にビューコントローラを以下にログインしているユーザその下に保存されるように入りました。たとえば、次のビューコントローラでは、変数bookieAmountを持っていますが、ログインした各ユーザが個別のノードを持つ場所に自分のコードを変更すると、bookieAmountを保存できますか?これまでのところ、私はそのような機能を実装しようとすると、それは以前のリファレンスを置き換えて、私が望むような特定のユーザーのための新しいものを作成しません。次のビューコントローラの

コード:あなたが何ができるか

class FlavorsController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

var bookieFlavors = ["Chocolate Chip", "Sugar w/o icing", "Sugar w/ icing", "Peanut Butter", "Honey", "Shortbread", "Ginger", "Double Chocolate", "Macadamie Nut", "Oatmeal Raisin", "Snickerdoodle"] 
var amount = [Int]() 
var bookieTotal = Int() 
var ref: DatabaseReference! 
var flavorRef: DatabaseReference! 
var email = String() 





override func viewDidLoad() { 
    super.viewDidLoad() 
    for _ in self.bookieFlavors { 
     self.amount.append(0) 
    } 
    flavorTable.delegate = self 
    flavorTable.dataSource = self 

    //database references 
    ref = Database.database().reference() 
    flavorRef = Database.database().reference() 



} 

func emptyAmount(_ sender: UIButton) { 
    print("Button Held, Amount Emptied") 
    self.amount[sender.tag] = self.amount[sender.tag] - (self.amount[sender.tag] + 1) 
    let cell = self.flavorTable.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? FlavorTableCell 
    cell?.bookieAmount.text = "= \(self.amount[sender.tag])" 

} 


@IBAction func bookieButton(_ sender: UIButton) { 

    self.amount[sender.tag] = self.amount[sender.tag] + 1 
    let cell = self.flavorTable.cellForRow(at: IndexPath(row: sender.tag, section: 0)) as? FlavorTableCell 
    cell?.bookieAmount.text = "= \(self.amount[sender.tag])" 
    // print(amount[sender.tag]) 

    self.bookieTotal = amount.reduce(0, +) 
    print(bookieTotal) 
} 




@IBOutlet weak var flavorTable: UITableView! 


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int  
{ 
    return bookieFlavors.count 

} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FlavorTableCell 


    //flavor label configuration 
    cell.flavorLabel.text = bookieFlavors[indexPath.row] 

    //amount configuration 
    cell.bookieAmount.text = "= \(self.amount[indexPath.row])" 
    cell.bookieButton.tag = indexPath.row 
    cell.bookieButton.addTarget(self, action: #selector(bookieButton(_:)), for: .touchUpInside) 
    cell.bookieButton.addTarget(self, action: #selector(emptyAmount(_:)), for: .touchDownRepeat) 

    return cell 

} 

@IBAction func registerBookieAmount(_ sender: Any) { 
    print(bookieTotal) 

    let amount: Int = bookieTotal 
    let user = Auth.auth().currentUser 

    if ((user) != nil) { 


    } 

} 

答えて

1

はどこだろう、ユーザーがまだこのコードによって

if Auth.auth().currentUser != nil { 
    // User is signed in. 
    let ref = Database.database().reference() 
    ref.child("users").child(user.uid).child("orders").setValue(["order": orderNumber]) 
} else { 
    // No user is signed in. 

} 
+0

をログインしているかどうかを確認するためにFirebaseサーバーにリクエストを作ることですこれを私のコードに入れてください。 –

+0

最終的にユーザーデータを取得し、それをfirebase – Siyavash

+0

に送信したい場合、そのユーザーの次のすべてのデータ参照を同じ元の参照で保存するにはどうすればよいですか?別のビューコントローラーからデータを参照したり、アプリ全体でデータを追加したりする場合、どうすれば既存の参照に追加することができますか? –

関連する問題