Swift 3:如何在表格视图的多个部分中使用操作按钮?

Posted

技术标签:

【中文标题】Swift 3:如何在表格视图的多个部分中使用操作按钮?【英文标题】:Swift 3: How to use action button in multiple sections of a table view? 【发布时间】:2016-09-26 14:13:19 【问题描述】:

当在每个部分的每一行中单击一个按钮时,我正在尝试运行一个独特的功能。 例如,问题是,如果我在 3 个部分中有 3 行,并且我将第一行配置为在按下按钮时运行一个功能,则所有 3 个部分的第一行都运行相同的功能。我正在尝试为不同部分的所有行实现独特的功能。

这是我的tableView 代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: languageID, for: indexPath) as! LanguageTableViewCell

    switch indexPath.row 
    case 0:
        cell.phraseLBL.text = "description 1"
        cell.playBtn.tag = indexPath.row
        cell.playBtn.addTarget(self, action: #selector(PhraseVC.pressPlay), for: .touchUpInside)

    case 1:
        cell.phraseLBL.text = "description 2"
        cell.playBtn.tag = indexPath.row
        cell.playBtn.addTarget(self, action: #selector(PhraseVC.pressPlay), for: .touchUpInside)

    case 2:
        cell.phraseLBL.text = "description 3"
        cell.playBtn.tag = indexPath.row
        cell.playBtn.addTarget(self, action: #selector(PhraseVC.pressPlay), for: .touchUpInside)
    default:
        break
    

    return cell

这是ButtonIBAction

@IBAction func pressPlay(sender: UIButton)

        switch sender.tag 
        case 0:
            print("button 1 pressed")

        case 1:
            print("button 2 pressed")

        case 2:
            print("button 3 pressed")

        case 3:
            print("button 4 pressed")

        case 4:
            print("button 5 pressed")
        default:
            break;
        
    

【问题讨论】:

【参考方案1】:

你可以这样做

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: languageID, for: indexPath) as! LanguageTableViewCell
    
    switch indexPath.row 
    case 0:
        cell.phraseLBL.text = "description 1"
        
        
    case 1:
        cell.phraseLBL.text = "description 2"
        
    case 2:
        cell.phraseLBL.text = "description 3"
       
    default:
        break
    
    
    cell.playBtn.tag = indexPath.row
    cell.playBtn.addTarget(self, action: #selector(PhraseVC.pressPlay(_:)), for: .touchUpInside)
  
    
    return cell

并将方法调用为

@IBAction func pressPlay(_ sender: UIButton)
    
    let touchPoint = sender.convert(CGPoint.zero, to:maintable)
    // maintable --> replace your tableview name
    
    let clickedButtonIndexPath = mainTable(forRowAtPoint: touchPoint)
    
   
    

对于最新的 Swift 版本:

 @IBAction func pressPlay(_ sender: UIButton)
    let touchPoint = sender.convert(CGPoint.zero, to:self.tableView)
    // tableView --> replace your tableview name
    if let clickedButtonIndexPath = self.tableView.indexPathForRow(at: touchPoint) 
        print("Section : \(clickedButtonIndexPath.section) , Row:  \(clickedButtonIndexPath.row)")
    

【讨论】:

【参考方案2】:

您可以为每个单元格设置索引路径而不是标记。 IndexPath 由部分和行组成。通过检查按钮属于哪个部分和哪一行,您可以唯一地识别正确的功能。

【讨论】:

以上是关于Swift 3:如何在表格视图的多个部分中使用操作按钮?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 处理表格视图多个部分的自定义复选标记按钮状态

如何使用 Swift 在 XCode UI 自动化中选择随机表格视图单元格

多个位置的相同TableView swift 3

在多节表视图中使用文本字段进行搜索 - Swift

如何在swift ios中将多个图像添加到自定义表格视图单元格?

Swift UITableView(无部分)过滤到带有部分的表格视图