現在の私の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) {
}
}
をログインしているかどうかを確認するためにFirebaseサーバーにリクエストを作ることですこれを私のコードに入れてください。 –
最終的にユーザーデータを取得し、それをfirebase – Siyavash
に送信したい場合、そのユーザーの次のすべてのデータ参照を同じ元の参照で保存するにはどうすればよいですか?別のビューコントローラーからデータを参照したり、アプリ全体でデータを追加したりする場合、どうすれば既存の参照に追加することができますか? –