表内的 UIButton 未触发

Posted

技术标签:

【中文标题】表内的 UIButton 未触发【英文标题】:UIButton inside table not triggering 【发布时间】:2016-08-30 18:27:43 【问题描述】:

您好,我正在尝试弄清楚如何在情节提要的 UItable 中的自定义单元格内调用 UIButton。目前我有一个库,可以创建一个运行良好的侧边菜单(更多信息在这里),我可以看到我在启动模拟器时放置的按钮。但是,当我点击按钮时,该操作触发,您能否指导我如何实现这一点?

重要提示该表格完全是在情节提要中创建的。

我在TopratedVC.swift 中的工作代码以获取触发操作的按钮:

override func viewDidLoad() 
super.viewDidLoad()

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("UITableViewVibrantCell") as! CellClassMenu

    cell.sendFeedBackBtn.tag = indexPath.row
    cell.sendFeedBackBtn.addTarget(self, action: "sendFeedBackBtnAction:", forControlEvents: .TouchUpInside)
    cell.contentView.userInteractionEnabled = false //tried with true as well, no difference
    cell.bringSubviewToFront(cell.sendFeedBackBtn)
    cell.userInteractionEnabled = true

    return cell


func sendFeedBackBtnAction(sender: UIButton)

    print("sendFeedBackBtnAction tapped")

我的UITableViewVibrantCell.swift 文件包含以下内容:

import UIKit

class UITableViewVibrantCell: UITableViewCell 

@IBOutlet var sendFeedBackBtn: UIButton!

我的sndFeedBackBtn 有一个指向UITableViewVibrantCellsendFeedBackBtn 的引用出口,它的类为UITableViewVibrantCell。我究竟做错了什么?谢谢。

模拟器中的样子:

【问题讨论】:

为什么不在 UITableViewCell 类中为该按钮创建一个@IBAction? 【参考方案1】:

在您的帖子中,您显示了一个UITableViewVibrantCell 类,并使用“UITableViewVibrantCell”标识符将一个单元格出列,但将其转换为CellClassMenu

无论如何,最好为动作创建一个单元格委托,并让您的控制器决定实现,而不是在每次单元格出列时添加一个目标。你可以这样做:

UITableViewVibrantCell

import UIKit

protocol UITableViewVibrantCellDelegate: NSObjectProtocol 
    func buttonPressed(sender: UIButton)


class UITableViewVibrantCell: UITableViewCell 

    var delegate: UITableViewVibrantCellDelegate?
    @IBOutlet var feedbackButton: UIButton!

    override func awakeFromNib() 
        super.awakeFromNib()
        feedBackButton.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: .TouchUpInside)
    
    func buttonPressed(sender: UIButton) 
        delegate?.buttonPressed(sender)
    

***VC

class TopratedVC: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("UITableViewVibrantCell") as! UITableViewVibrantCell
        cell.delegate = self
        return cell
    

    // MARK: - UITableViewVibrantCellDelegate
    func buttonPressed(sender: UIButton) 
        print("feedbackButton tapped")
    

【讨论】:

【参考方案2】:

选择器(“sendFeedBackBtnAction:”)不能传递参数。 sendFeedBackBtnAction 函数中不需要参数,因为您只为此按钮调用它。所以改变我会把它改成简单的......

func sendFeedBackBtnAction()

那么我还建议您将选择器更改为更新的 swift 版本...

cell.sendFeedBackBtn.addTarget(self, action: #selector(sendFeedBackBtnAction), forControlEvents: .TouchUpInside)

【讨论】:

以上是关于表内的 UIButton 未触发的主要内容,如果未能解决你的问题,请参考以下文章

tableviewcell 内的 UIButton 触发单元格而不是按钮 [重复]

UIButton 操作未在模态显示的 ViewController 上触发

UIScrollView 内的 UIView 上的 UIButton

视图控制器内的 UIButton 不响应任何操作

未调用编程 UIButton 操作

命中测试位于 SuperView 边界之外的 UIButton