簡體   English   中英

如何為我的 CollectionView 單元格提供 onclick 功能?

[英]How can I have onclick functionality for my CollectionView cells?

我想這樣做,以便當我點擊 CollectionView Cell 時,它會轉到另一個視圖。 我還想將用戶 ID 傳遞給此視圖,以便我可以查詢數據庫。 這是我到目前為止所實施的:

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


        let cell = collectionview.dequeueReusableCell(withReuseIdentifier: "userCell", for: indexPath) as! UserCell

        print(user[indexPath.row].imagePath!)


        cell.userImage.sd_setImage(with: URL(string: user[indexPath.row].imagePath!))

        cell.nameLabel.text = user[indexPath.row].username
        cell.userID = user[indexPath.row].userID

        let destinationVC = ProfileViewController()
        destinationVC.sentUserID = user[indexPath.row].userID!

        // Let's assume that the segue name is called playerSegue
        // This will perform the segue and pre-load the variable for you to use
        //destinationVC.performSegue(withIdentifier: "toProfileFromSearch", sender: self)


        cell.addButtonTapAction = {
            // implement your logic here, e.g. call preformSegue()
            self.performSegue(withIdentifier: "toProfileFromSearch", sender: self)
        }
        //cell.userImage.downloadImage(from: self.user[indexPath.row].imagePath!)
        //checkFollowing(indexPath: indexPath)


        return cell
    }

這是在每個單元格的單獨創建中。 當我單擊搜索區域中的用戶個人資料時,沒有任何反應。

我遵循了其他堆棧溢出問題才走到這一步。 任何人都可以為其他需要這個的人提供完整的解決方案嗎?

您可以使用didSelectItemAt函數,檢查這個

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "IDYOURVIEW") as! ProfileViewController
    VC1.sentUserID = user[indexPath.row].userID!
    self.navigationController?.pushViewController(VC1, animated: true)
}

如果你使用 segues

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "toProfileFromSearch", sender: user[indexPath.row].userID!)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    if segue.identifier == "toProfileFromSearch"
    {
      let vc = segue.destination as? ProfileViewController
      if let id = sender as! String
      {
          vc?.sentUserID = id
      }
    }
}

還有另一種更好的方法可以使用protocol來處理這個問題

protocol UserCellTapedDelegate: AnyObject {
    func didTapButton(_ cell: UserCell, didSelectItemAt id: Int)
}

那么你的手機會是這樣的:

class UserCell: UICollectionViewCell {
    public var userID: Int!
    public weak var delegate: UserCellTapedDelegate?
    
    @objc private func addButtonTapAction() {
        delegate?.didTapButton(self, didSelectItemAt: userID)
    }
}

userID :存儲用戶ID。

delegate :在您的單元格中使用可選的弱(就 memory 管理而言)委托引用。

addButtonTapAction函數來處理任何 UIView 上的按鈕/或點擊手勢的目標。


下一步是將 go 返回到您的 UIViewController 並符合自定義委托:

extension ViewController: UserCellTapedDelegate  {
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionview.dequeueReusableCell(withReuseIdentifier: "userCell", for: indexPath) as! UserCell
        ...

        cell.userID = user[indexPath.row].userID!
        cell.delegate = self

        return cell
     }

    func didTapButton(_ cell: UserCell, didSelectItemAt id: Int) {
        self.performSegue(withIdentifier: "toProfileFromSearch", sender: id)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toProfileFromSearch" {
            let vc = segue.destination as! ProfileViewController
            if let id = sender as! String {
                vc.sentUserID = id
            }
        }
    }
}

希望這對你有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM