这似乎已经在swift和objc中被问了几次,但是我无法看到swift的正确答案,所以希望有人可以帮助我。我已经创建了一个自定义配件视图按钮,但需要正确的按钮操作:as" accessoryButtonTapped"是一个无法识别的选择器。
调用tableViewCellDelegate方法所需的选择器willSelectRowAtIndexPath?
我的代码是:
let cellAudioButton = UIButton(type: .Custom)
cellAudioButton.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
cellAudioButton.addTarget(self, action: "accessoryButtonTapped", forControlEvents: .TouchUpInside) //INCORRECT ACTION:
cellAudioButton.setImage(UIImage(named: "blueSpeaker.png"), forState: .Normal)
cellAudioButton.contentMode = .ScaleAspectFit
cell.accessoryView = cellAudioButton as UIView
提前感谢任何可以提供帮助的人。
答案 0 :(得分:8)
为什么需要致电willSelectRowAtIndexPath
?您已完成所有操作并解决了unrecognized selector
错误,只需创建一个在您点按cell.accessoryView
时将会调用的函数。在你的情况下:
func accessoryButtonTapped(){
print("Tapped")
}
<强>更新强>
如果你想获得indexPath,你可以
为cellAudioButton
添加标记:
cellAudioButton.tag = indexPath.row
在addTarget
添加:
以传递参数
在你的功能中
func accessoryButtonTapped(sender : AnyObject){
print(sender.tag)
print("Tapped")
}
所以整个代码:
let cellAudioButton = UIButton(type: .Custom)
cellAudioButton.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
cellAudioButton.addTarget(self, action: "accessoryButtonTapped:", forControlEvents: .TouchUpInside)
cellAudioButton.setImage(UIImage(named: "blueSpeaker.png"), forState: .Normal)
cellAudioButton.contentMode = .ScaleAspectFit
cellAudioButton.tag = indexPath.row
cell.accessoryView = cellAudioButton as UIView
func accessoryButtonTapped(sender : AnyObject){
print(sender.tag)
print("Tapped")
}
答案 1 :(得分:3)
Swift 3.1 Rashwan 的更新解决方案
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
//add button as accessory view
let cellAudioButton = UIButton(type: .custom)
cellAudioButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
cellAudioButton.addTarget(self, action: #selector(ViewController.accessoryButtonTapped(sender:)), for: .touchUpInside)
cellAudioButton.setImage(UIImage(named: "closeRed"), for: .normal)
cellAudioButton.contentMode = .scaleAspectFit
cellAudioButton.tag = indexPath.row
cell.accessoryView = cellAudioButton as UIView
return cell
}
func accessoryButtonTapped(sender : UIButton){
print(sender.tag)
print("Tapped")
}
注意:强>
此处 ViewController 是 Class 的名称,例如 LoginViewController
答案 2 :(得分:0)
您为什么不使用UITableViewDelegate
?
@available(iOS 2.0, *)
optional func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath)
编辑:
我不知道为什么我的答案被否决了。为了澄清这一点,这是可能的。您可以将自定义UI元素用作附件按钮。
这里是一个示例–假设您正在使用Interface Builder。将UISwitch
添加到自定义单元格。现在,右键单击从UITableViewCell
到UISwitch
的拖放。选择accessoryView
作为插座连接。完成。
每次按下切换按钮时,都会触发委托方法。这也应适用于其他动作元素,例如UIButton
。这正是OP所要求的用例。