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