自定义配件视图按钮的动作是什么 - swift

时间:2016-01-13 22:27:51

标签: ios swift uitableview

这似乎已经在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

提前感谢任何可以提供帮助的人。

3 个答案:

答案 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添加到自定义单元格。现在,右键单击从UITableViewCellUISwitch的拖放。选择accessoryView作为插座连接。完成。

每次按下切换按钮时,都会触发委托方法。这也应适用于其他动作元素,例如UIButton。这正是OP所要求的用例。