【问题标题】:Swift - Custom TableView Not Executing Click on UIButtonSwift - 自定义 TableView 未执行单击 UIButton
【发布时间】:2015-02-12 20:18:06
【问题描述】:

我正在尝试使用 Swift 完成我认为很简单的任务。我创建了一个自定义 TableView 单元格并为其添加了一个按钮。我希望能够看到当你点击按钮时会发生一些动作。不幸的是,当我单击按钮时,什么也没有发生。有人可以对此有所了解吗?我把代码放在下面:

自定义 TableView 单元格:

import UIKit

class TestTableViewCell: UITableViewCell {

@IBOutlet weak var testBtn: UIButton!
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

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

    // Configure the view for the selected state
}
func buttonTappedOnCell()
{
    println("buttonTapped!")
}

}

下面是正在调用的视图控制器中的代码:

  func tableView(tableView: UITableView,
    cellForRowAtIndexPath
    indexPath: NSIndexPath) -> UITableViewCell {
        tableView.registerNib(UINib(nibName:"TestTableViewCell", bundle:nil), forCellReuseIdentifier:"TestButtonCell")
 let cell =
        tableView.dequeueReusableCellWithIdentifier("TestButtonCell", forIndexPath: indexPath) as TestTableViewCell

           cell.testBtn.addTarget(cell, action: "buttonTappedOnCell", forControlEvents: UIControlEvents.TouchDown)
        return cell
}

我还尝试更改调用以包含 ':' -> cell.testBtn.addTarget(cell, action: "buttonTappedOnCell:", forControlEvents: UIControlEvents.TouchDown) 但这不起作用。我尝试的另一件事是将调用函数移动到视图控制器中,并将目标操作指向 self。不幸的是,这也不起作用。这个工作的一个简单的例子会很棒。在一天结束时,希望能够有一个自定义的表格视图单元格,其中包含 6 个单选按钮,允许用户只选择一个。但是在这一点上,婴儿先一步。感谢您的帮助。

【问题讨论】:

  • 至少,我会将.addTarget(... 移动到单元格子类中。每次出队时都不需要重新分配按钮的目标。所以,相反,在awakeFromNib 中,执行如下操作:testBtn.addTarget(self, action: "buttonTappedOnCell", forControlEvents:.TouchUpInside)
  • 另外,registerNib实际上只需要在UITableViewController生命周期中出现一次,将其移入viewDidLoad
  • 只是检查基础知识:您确定您已将IBOutlet 正确设置为单元格的按钮吗?如果是nil,可能是它没有转发其触摸事件的原因。

标签: ios uitableview cocoa-touch swift


【解决方案1】:

我认为问题是由您在代码中指定的事件引起的。

 cell.testBtn.addTarget(cell, action: "buttonTappedOnCell", forControlEvents: UIControlEvents.TouchDown)

ToouchDown 更改为 TouchUpInside

cell.testBtn.addTarget(cell, action: "buttonTappedOnCell", forControlEvents: UIControlEvents.TouchUpInside)

另外你为什么要以编程方式设置它?从您的代码中,我认为您的故事板上有按钮。那么为什么要以编程方式添加 IBAction 呢? (因为该操作也在同一个类上调用)。

将您的 buttonTappedOnCell 声明为 IBAction,并将其直接连接到 storyboard/xib 上的按钮。

【讨论】:

  • 我同意更改为这个事件,但你认为为什么会导致 action 方法不触发?
  • @mbm29414 可能有几个原因。 1)由于订阅了错误的事件(如我的回答)2)用户交互可能是错误的等
  • 是的,但是TouchDown总是TouchUpInside 之前触发(即,如果没有先获得TouchDown,您将无法获得TouchUpInside),而TouchUpInside 可能不会根据用户交互触发。我同意使用 TouchUpInside,但我看不出它将如何解决 OP 遇到的问题。
  • 其实我以前也有过 TouchUpInside,但改用 TouchDown 进行测试。我改回来了,但还是有同样的问题。
  • 我在 IB 中为按钮和单元格检查了 UserInteraction。
猜你喜欢
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多