【问题标题】:Swift 4: Passing from table view to view controller - Firebase?Swift 4:从表视图传递到视图控制器 - Firebase?
【发布时间】:2021-06-01 01:56:04
【问题描述】:

我花了几个小时研究相同的问题,但我找到的答案都没有解决这个问题。需要来自 Firebase 数据库的数据从 tableview 传递到另一个视图控制器。 PD需要显示的数据不在单元格中,我需要从单击表单视图行的 ID 从 Firebase 获取。 我已经和手写的照片来解释我需要什么。

这是我的 VC 1 代码:

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "guestCell", for: indexPath) as! GuestTableViewCell
    let guest: GuestModel
    guest = guestsList[indexPath.row]
    
    cell.guestNameLabel.text = guest.guestName
    cell.attendingLabel.text = guest.attendingStatus
    cell.menuLabel.text = guest.menuStatus
    cell.ageLabel.text = guest.ageStatus
    cell.tableLabel.text = guest.tableNo
    
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let selectedGuest = guestsList[indexPath.row]
    
    let controller = self.storyboard?.instantiateViewController(identifier: "GuestDetail") as! GuestDetailsViewController
    
    controller.guestUser = selectedGuest
   self.present(controller, animated: true, completion: nil)

}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    
    if editingStyle == .delete {
        let guest = guestsList[indexPath.row]
        self.guestsList.remove(at: indexPath.row)
        self.guestsTableView.reloadData()
        self.deleteGuest(id: guest.id!)
    }
}

还有 VC 2

var ref: DatabaseReference!
let uid = Auth.auth().currentUser?.uid
var guestDetail = [GuestModel]()
var guestUser: GuestModel?
var documenID: String?



override func viewDidLoad() {
    super.viewDidLoad()
    
  showGuestDetails()
  
}

func showGuestDetails(){
    ref = Database.database().reference().child("userInfo").child(uid!).child("guests")
    ref.queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
        
        if snapshot.childrenCount>0{
            self.guestDetail.removeAll()

            for guests in snapshot.children.allObjects as![DataSnapshot]{
                let guestObject = guests.value as? [String: AnyObject]
                let name = guestObject?["guestName"]
                let familyName = guestObject?["guestFamilyName"]
                let phone = guestObject?["guestPhoneNumber"]
                let email = guestObject?["guestEmail"]

                let guest = GuestModel(guestName: name as? String, guestFamilyName: familyName as! String, guestPhoneNumber: phone as? String, guestEmail: email as? String)


                self.phoneNoLabel.text = guest.guestPhoneNumber
                self.emailLabel.text = guest.guestEmail
            }
        }
    }
    self.nameLabel.text = guestUser!.guestName
}'''

【问题讨论】:

    标签: ios swift uitableview firebase-realtime-database


    【解决方案1】:

    您可以通过两种方式达到预期的效果:

    1. 将 autoId 从 1st VC 传递到 2nd Detail VC,并在 showGuestDetails() 中将您的引用设为

      ref = Database.database().reference().child("userInfo").child(uid!).child("guests").child(passedAutoID)
      
    2. 保持相同的引用,但使用 if 条件检查用户是否与要求的用户相同

      for guests in snapshot.children.allObjects as![DataSnapshot]{
           let guestObject = guests.value as? [String: AnyObject]
           guard let email = guestObject?["guestEmail"] as? String,
                 email != guestUser?.email else {
                 continue
           }
      
           let name = guestObject?["guestName"]
           let familyName = guestObject?["guestFamilyName"]
           let phone = guestObject?["guestPhoneNumber"
      
           let guest = GuestModel(guestName: name as? String, guestFamilyName: familyName as! String, guestPhoneNumber: phone as? String, guestEmail: email as? String)
           self.nameLabel.text = guest.guestName
           self.phoneNoLabel.text = guest.guestPhoneNumber
           self.emailLabel.text = guest.guestEmail
       }
      

    【讨论】:

    • 因为我是swift新手,你能告诉我在哪里定义passedAutoID吗?同样在第二个示例中,我收到此消息“二进制运算符'!='不能应用于'AnyObject?'类型的操作数?和'字符串?'"
    • 对于 1. 您必须将其保存在您的第一个 VC 中并将其传递给您的第二个 VC。您可以通过打印您的 firebase dict 并将值保存在变量中轻松获得它。对于2.我已经编辑了答案,请检查。
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多