didSelectRowAt 不适用于我的 UITableViewController

Posted

技术标签:

【中文标题】didSelectRowAt 不适用于我的 UITableViewController【英文标题】:didSelectRowAt is not working with my UITableViewController 【发布时间】:2019-05-30 00:26:16 【问题描述】:

我的 UITableVieController 有问题。它没有正确调用我的 didSelectRowAt 函数。我的 UITableView 中有多个部分,但我的代码的另一部分具有相同的确切代码工作得非常好,我不知道为什么这不起作用

我已经检查了我的表格视图是否具有正确的委托和数据源,并且确实如此。

 override func numberOfSections(in tableView: UITableView) -> Int 
        return 2
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return section == 0 ? 1 : songList.count
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        if indexPath.section == 0 
            let cell = tableView.dequeueReusableCell(withIdentifier: "InfoCell", for: indexPath) as! InfoCell

            cell.playlistImage.image = playlistImage
            cell.name.text = selectedPlaylist
            cell.nuberOfSongs.text = "Number of Songs: \(playlistCount)"

            return cell
         else 
            let cell = tableView.dequeueReusableCell(withIdentifier: "SongCell", for: indexPath) as! SongCell
            cell.SongTitle.text = songList[indexPath.row]
            cell.SongArtist.text = artistList[indexPath.row]
            cell.SongImage.image = imageList[indexPath.row]
            return cell
        
    


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        if indexPath.section != 0 

            selectedItem = mediaList[indexPath.row]

            play(selectedItem: selectedItem)

            performSegue(withIdentifier: "showPlayer", sender: self)

            tableView.deselectRow(at: indexPath, animated: true)
        

    

这是我用于创建部分和这些部分中的行的所有代码。它还包含 didSelectRowAt 的代码,但根本没有调用该函数。

【问题讨论】:

它不会做任何事情的唯一原因是因为您总是在第 0 部分选择一行 @MXNMike 为什么我总是在第 0 部分选择一行? delegate 没有真正设置,或者单元格上有视图阻止点击导致选择行。 这就是为什么它应该做任何事情的唯一原因,如果你说代理设置正确,如果你在你的检查行中放置一个断点,你是否命中了那个断点? @DevAlphas 你能确保你的tableView 的allowsSelection 属性是true 吗? (developer.apple.com/documentation/uikit/uitableview/…) 【参考方案1】:

您是否为 UITableView 的父视图提供了 UITapGestureRecogniser,如果是这种情况,那么 UITableview 的 didSelectRowAt 方法将不起作用,因为您的父视图正在接收触摸而不是 tableview 单元格。

为此,您可以像这样向您的UITapGestureRecogniser 添加一个代理:

let tap = UITapGestureRecognizer(target: self, action: #selector(selectorFunction))
tap.delegate = self
superview.addGestureRecognizer(tap)

在此之后,只需使您的视图控制器符合此委托

extension YourViewController : UIGestureRecognizerDelegate

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool 
        if (touch.view?.isDescendant(of: yourTableView))!
        
            return false
        
        return true
    

【讨论】:

以上是关于didSelectRowAt 不适用于我的 UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章

didSelectRowAt 更改所有行中的值

UITableView 单元格折叠动画看起来很糟糕

Pickerview 选择行和 didSelectRowAt 函数

为自定义单元格调用 didSelectRowAt 索引

在 tableView(:didSelectRowAt) 中为自定义表格单元格 UILabel 设置值

Swift 4:没有调用 didSelectRowAt 委托