【发布时间】:2018-04-02 10:37:54
【问题描述】:
我的应用中的“关注”按钮和“喜欢”按钮都存在同样的问题。
我在 Firebase Firestore 文档中看到了如何在按下时添加数据以及如何删除记录,但是,我在更新视图加载时要选择或不选择的按钮的初始状态时遇到了问题。
这会在 awakeWithNib 中完成吗?你会添加一个快照监听器吗?
FollowerCell.swift
class FollowerCell: UITableViewCell {
// MARK: - Outlets
@IBOutlet weak var friendImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var followButton: SpringButton!
// MARK: - Variables
var userId:String!
var db:Firestore!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
friendImageView.layer.masksToBounds = true
db = Firestore.firestore()
self.setFollowingButton()
}
// MARK: - Functions
func setFollowingButton() {
if let currentUser = Auth.auth().currentUser {
let followerDB = db.collection("users").document(currentUser.uid).collection("followers").whereField("follower", isEqualTo: true)
followerDB.getDocuments { (querySnapshot, error) in
if let error = error {
print("Error getting documents: \(error)")
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
self.followButton.isSelected = true
})
}
}
}
}
@IBAction func followButtonPressed(_ sender: UIButton) {
if followButton.isSelected == true {
followButton.isSelected = false
// add follower
if let user = Auth.auth().currentUser {
Firestore.firestore().collection("users").document(user.uid).collection("following").document("\(userId!)").setData([
"name":self.nameLabel.text ?? "",
"following":true
]) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("\(self.userId!) added to followers")
}
}
}
} else {
followButton.isSelected = true
// delete following
if let user = Auth.auth().currentUser {
Firestore.firestore().collection("users").document(user.uid).collection("following").document("\(userId!)").delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("\(self.userId!) successfully removed!")
}
}
}
}
}
【问题讨论】:
-
如果我理解正确,您的 Firestore 集合(或查询)会填充一个表格(其中每个 Firestore 文档对应一个表格行。)我会让您的 FollowerCell 将 Firestore 文档作为属性(或通过方法)。然后让 FollowerCell 根据文档更新自己的按钮。
-
仍然有问题。如果我在 awakeWithNib 中调用该函数,它会返回 nil,除非设置一个计时器在一秒钟后调用它
-
不要从 awakeFromNib 调用它。从 tableViewDelegate 的 cellForRowAt 方法调用它 - 当你应该配置单元格时,在出队之后和返回之前。
-
啊谢谢@AgRizzo。一直试图从单元格中调用一个函数,但是当我刚刚在 tableview 中创建函数并使用单元格中的属性时它起作用了
标签: swift uitableview firebase google-cloud-firestore