UITableViewCell 子类中的 UIButton 未注册点击

Posted

技术标签:

【中文标题】UITableViewCell 子类中的 UIButton 未注册点击【英文标题】:UIButton in UITableViewCell subclass not registering taps 【发布时间】:2015-03-07 22:40:55 【问题描述】:

我有一个收藏按钮,我希望能够点击它来将一个单元格标记为收藏。该单元格也是可点击的。

这是 UITableViewCell 的子类。我已经添加了按钮,但我无法让它调用目标操作。换句话说,我点击单元格中的按钮,但没有任何反应:

class ServerSelectionTableViewCell: UITableViewCell 

    let isSelected = UIImage(named: "icon.png")
    let unselected = UIImage(named: "star.png")
    var favoriteButton: UIButton? = nil

    var server : Server? = nil 
        didSet
            if let theServer = server 
                var server : String? = theServer.serverCode
                self.textLabel?.text = serverCode
                server?.isActive()  success in
                    self.accessoryType = success ? .Checkmark : .None
                
            
        
    

    required init(coder aDecoder: NSCoder!) 
        super.init(coder: aDecoder)
    

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: .Subtitle, reuseIdentifier: reuseIdentifier)
        self.detailTextLabel?.textColor = UIColor.grayColor()
        self.favoriteButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
        self.favoriteButton?.setImage(unselected, forState: UIControlState.Normal)
        self.favoriteButton?.setImage(isSelected, forState: UIControlState.Selected)
        self.favoriteButton?.addTarget(self, action: Selector("buttonAction:"), forControlEvents: UIControlEvents.TouchDown)

        setTranslatesAutoresizingMaskIntoConstraints(false)

        self.favoriteButton?.userInteractionEnabled = true
        self.contentView.addSubview(self.favoriteButton!)
    

    func buttonAction(sender:UIButton!) 
        println("Button tapped")
    

    override func layoutSubviews() 
        super.layoutSubviews()

        self.favoriteButton?.frame = CGRectMake(10, 5, 35, 35)
        self.textLabel?.frame = CGRectMake(55, 5, self.bounds.width, self.bounds.height)
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    


永远不会调用函数 buttonAction。我在模拟器和设备上都试过了,我可以看到当我点击收藏按钮时,单元格没有被选中,但函数仍然没有被调用。

编辑:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let reuseId = "cell"
    tableView.registerClass(ServerSelectionTableViewCell.self, forCellReuseIdentifier: reuseId)
    var cell = tableView.dequeueReusableCellWithIdentifier(reuseId) as ServerSelectionTableViewCell

    if let servers = getServers() 
        let server = servers[indexPath.row]

        cell.server = server
    

    return cell


override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) 
tableView.deselectRowAtIndexPath(indexPath, animated: true)
    if let servers = getServers() 
        let server = servers[indexPath!.row]
        var cell = tableView.cellForRowAtIndexPath(indexPath) as ServerSelectionTableViewCell

        println("Server selected \(server)")
    

【问题讨论】:

您是从 XIB 或 Storyboard 创建单元格还是完全从课堂上分配? 我没有为此使用界面构建器或情节提要,所以我假设我完全从类中分配 我没有看到您粘贴的代码有任何问题,所以我想问题出在其他部分。您能否展示一下如何创建 UITableView 以及 cellForRowAtIndexPath 方法? 我不知道这是否会有所不同,但您不应将单元格的 translatesAutoresizingMaskIntoConstraints 设置为 false。 当你按下按钮时,它会选择表格视图单元格吗? 【参考方案1】:

所以看起来按钮 WAS 正在注册水龙头,但线

println("Button tapped")

实际上并没有打印到控制台,所以我认为不是。

【讨论】:

以上是关于UITableViewCell 子类中的 UIButton 未注册点击的主要内容,如果未能解决你的问题,请参考以下文章

如何将 stackViews 添加到 UITableViewCell?

自定义 UITableViewCell 中的自定义 UIView

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

UITableViewCell - 设置单元格的最佳位置

UITableViewCell 中的徽章视图

子类中的窄属性类型