当 collectionView 位于 UITableView 行内时,collectionView 中的 didSelectItemAt 未被调用

didSelectItemAt from collectionView not getting called when the collectionView is inside a UITableView row

我有一个 tableView 功能搜索。第二行(indexPath.row = 1)里面有一个UICollectionView用来水平显示元素。

由于这些 UICollectionView 单元将成为用户,我想检测对它们的点击,这是我无法实现的。我想可能有一些我没有涵盖的内容,因为 collectionView 在 UITableView 的一行内。我附上一张图片,其中红色方块是 table.

行内的 collectionView 单元格

在我的 tableView 中,我有:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    if indexPath.section == 0 {
        if indexPath.row == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! RecentUserCell
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: recentTextReuseIdentifier, for: indexPath) as! RecentTextCell
            cell.viewModel = RecentTextCellViewModel(recentText: recentSearchedText[indexPath.row - 1])
            cell.selectionStyle = .none
            return cell
        }
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! RecentUserCell
        return cell
    }
}

而 RecentUserCell,里面有一个 collectionView。 最后一个方法 didSelectItemAt 没有被调用,这意味着我无法访问特定用户

private let identifier = "collectionCell"

class RecentUserCell: UITableViewCell {
    
    //MARK: - Properties
    private var users = [User]()
        
    public let collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        let collectionView = UICollectionView(frame: CGRect(), collectionViewLayout: layout)
        return collectionView
    }()
    
    //MARK: - Lifecycle
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        fetchUsers()
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.isUserInteractionEnabled = true
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: identifier)
        collectionView.showsHorizontalScrollIndicator = false
        addSubview(collectionView)
        collectionView.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //MARK: - API
    func fetchUsers() {
        UserService.fetchUsers { users in
            self.users = users
            self.collectionView.reloadData()
        }
    }
}

//MARK: - UICollectionViewDataSource

extension RecentUserCell: UICollectionViewDataSource {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return users.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) //as! UserCollectionViewCell
        //cell.delegate = self
        cell.backgroundColor = .red
        //cell.viewModel = UserCellViewModel(user: users[indexPath.row])
        return cell
    }
}

//MARK: - UICollectionViewDelegateFlowLayout

extension RecentUserCell: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 70, height: 80)
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("Selected item at \(indexPath.row)")
    }
}

任何人都知道我如何调用此方法或我可以使用什么策略来检测对此 UICollectionViewCells 的点击?

您的问题与将子视图直接添加到 UITableViewCell 而不是使用 contentView 有关。您可以阅读有关 UITableViewCell 内部结构的更多信息 here