通过委派在集合视图单元格中重新加载集合视图

时间:2017-02-25 16:24:10

标签: ios swift swift3 uicollectionview uicollectionviewcell

我有一个控制器(A),其集合视图具有2个单元类。其中一个(B)包含另一个Collection View。在做了一些研究之后,我仍然无法弄清楚如何更新(B)中的细胞(A)或其他地方以获得我想要的东西。

问题

(B)按下按钮时没有正确重新加载:按钮所绑定的单元格仍然可见,即使它在委托方法中从(A)中的userFriendRequests数组中删除了。作为奖励,我滚动到(B)中的新单元表示"索引超出范围"在cell.user = userFriendRequests[indexPath.row]行。

我有什么

控制器(A)

protocol UserFriendRequestsDelegate: class {

func didPressConfirmFriendButton(_ friendId: String?)
}

/...

fileprivate var userFriendRequests = [User]()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if userFriendRequests.isEmpty == false {

        switch indexPath.section {

        case 0:
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: friendRequestCellId, for: indexPath) as! UserFriendRequests
            cell.userFriendRequests = userFriendRequests
            cell.delegate = self
            return cell
        case 1:
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UserFriendCell
            let user = users[indexPath.row]
            cell.user = user
            return cell
        default:
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UserFriendCell
            return cell
        }
    }

/...

extension AddFriendsController: UserFriendRequestsDelegate {

internal func didPressConfirmFriendButton(_ friendId: String?) {

    guard let uid = FIRAuth.auth()?.currentUser?.uid, let friendId = friendId else {
        return
    }

    let userRef = FIRDatabase.database().reference().child("users_friends").child(uid).child(friendId)
    let friendRef = FIRDatabase.database().reference().child("users_friends").child(friendId).child(uid)
    let value = ["status": "friend"]

    userRef.updateChildValues(value) { (error, ref) in

        if error != nil {
            return
        }

        friendRef.updateChildValues(value, withCompletionBlock: { (error, ref) in

            if error != nil {
                return
            }

            self.setUpRequestsStatusesToConfirmed(uid, friendId: friendId)

            DispatchQueue.main.async(execute: {

                let index = self.currentUserFriendRequests.index(of: friendId)

                self.currentUserFriendRequests.remove(at: index!)

                for user in self.userFriendRequests {

                    if user.id == friendId {

                        self.userFriendRequests.remove(at: self.userFriendRequests.index(of: user)!)
                    }
                }
                self.attemptReloadOfCollectionView()
            })
        })
    }
}

PS:self.attemptReloadOfCollectionView()是一个简单地使计时器无效的函数,将其设置为0.1秒,然后在(A)的集合视图上调用reloadData()

CollectionViewCell(B)

weak var delegate: UserFriendRequestsDelegate?
var userFriendRequests = [User]()

/...


@objc fileprivate func confirmFriendButtonPressed(_ sender: UIButton) {

    delegate?.didPressConfirmFriendButton(friendId)
}

/...

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return userFriendRequests.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: friendRequestCellId, for: indexPath) as! FriendRequestCell

    cell.user = userFriendRequests[indexPath.row]

    return cell
}

/...

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    guard let firstName = userFriendRequests[indexPath.row].first_name, let lastName = userFriendRequests[indexPath.row].last_name, let id = userFriendRequests[indexPath.row].id else {
        return
    }

    nameLabel.text = firstName + " " + lastName
    friendId = id
    confirmButton.addTarget(self, action: #selector(confirmFriendButtonPressed(_:)), for: .touchUpInside)
}

我想要实现的目标

更新(B)当从(A)中的User数组中移除userFriendRequests时,此User由他的id通过(B)通过一行。

任何有关如何解决这个问题的好主意?

提前感谢您的帮助!

0 个答案:

没有答案