【问题标题】:Update Button UI in a TableViewCell with Firebase Firestore使用 Firebase Firestore 更新 TableViewCell 中的按钮 UI
【发布时间】: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


【解决方案1】:
class FollowersTableViewController: UITableViewController {

// MARK: - Variables
var db:Firestore!
let storage = Storage.storage().reference()
var followerArray = [User]()
var followingArray = [String]()

// MARK: - ViewDidLoad
override func viewDidLoad() {
    super.viewDidLoad()

    db = Firestore.firestore()

    SVProgressHUD.show()
    getFollowers()
    getFollowing()

    self.tableView.reloadData()

}

// MARK: - Table view data source

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

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

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

    // Configure the cell...
    let user = followerArray[indexPath.row]

    cell.nameLabel.text = user.name
    cell.userId = user.documentId
    // Set follow button state
    if followingArray.contains(cell.userId) {
        cell.followButton.isSelected = false
    } else {
        cell.followButton.isSelected = true
    }

    let userImageRef = storage.child("\(user.documentId)"+"/profile_pic.jpg")
    // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
    userImageRef.getData(maxSize: 1 * 1024 * 1024) { (data, error) in
        if let error = error {
            // Uh-oh, an error occurred! Display Default image
            print("Error - unable to download image: \(error)")
            cell.friendImageView.image = UIImage(named: "userProfileGray")
        } else {
            // Data for "locationImages/(locationId).jpg" is returned
            cell.friendImageView.image = UIImage(data: data!)
        }
        SVProgressHUD.dismiss()
    }

    return cell
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 71
}

// MARK: - Functions
func getFollowers() {
    if let user = Auth.auth().currentUser {
        let followingDB = db.collection("users").document("\(user.uid)").collection("followers").whereField("follower", isEqualTo: true)
        followingDB.getDocuments { (querySnapshot, error) in
            if let error = error {
                print("Error getting documents: \(error)")
            } else {
                for document in (querySnapshot?.documents)! {
                    self.followerArray.append(User(name: document["name"] as! String, documentId: document.documentID))
                }
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
        }
    }
}

func getFollowing() {
    if let currentUser = Auth.auth().currentUser {
        let followingDB = db.collection("users").document(currentUser.uid).collection("following").whereField("following", isEqualTo: true)
        followingDB.getDocuments { (querySnapshot, error) in
            if let error = error {
                print("Error getting documents: \(error)")
            } else {
                for document in (querySnapshot?.documents)! {
                    self.followingArray.append(document.documentID)
                }
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
        }
    }
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2023-03-23
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多