ios - 如何使用选择器通过函数传递两个参数
问题描述
在cellForRowAtIndexPath
,我试图将开关选择和字符串传递给选择器函数,但我不能。请帮忙。
let pidName = "someString"
cell.switchSelection.tag = indexPath.row
cell.switchSelection.addTarget(self, action:
#selector(self.switchOperation(_:pid:)), for: .valueChanged)
在这里我必须通过发件人pidName
但失败了
@objc func switchOperation(_ sender: UISwitch, pid: Any){
let store = (sender).isOn
let settingTag = pid
}
解决方案
正确的解决方案是将操作移动到您的单元格类中:
class MyCell: UITableViewCell {
@IBOutlet weak var switchSelection: UISwitch!
override func awakeFromNib() {
super.awakeFromNib()
switchSelection.addTarget(self, action: #selector(MyCell.action(_:)), for: .valueChanged)
}
func configure(switchAction: @escaping (Bool) -> Void) {
self.switchAction = switchAction
}
@objc func action(_ sender: UISwitch) {
switchAction(sender.isOn)
}
private var switchAction: (Bool) -> Void = { _ in }
}
现在在您的表视图委托中,您可以这样做:
let pidName = "someString"
cell.configure(switchAction: { [weak self] isOn in
let store = isOn
let settingTag = pid
}
或者你可以这样做:
let pidName = "someString"
cell.configure(switchAction: { [weak self] isOn in
self?.switchOperation(isOn: isOn, pid: pid)
}
@objc func switchOperation(isOn: Bool, pid: Any){
let store = isOn
let settingTag = pid
}
推荐阅读
- c++ - 使用 extern "C" 时类型与先前的外部 decl 不匹配
- php - 当 SPA 中的路由更改时,http 请求会发生什么
- css - 如何在每个 2 列/1 行视图中显示每 4 个 LI 后设置 LI 样式?
- sql - SQL Server:获取第一列中的最后 4 个字符并获取第二列中单词的第一个字母,但忽略非字母
- ios - 更改选项卡时以模态方式关闭 ViewController
- jquery - 如何使用jquery更改materializecss select中的选定值
- angular - 带有角度自定义管道的离子 v4 不起作用
- math - 哪些公理可以安全地添加到 Coq 中?
- node.js - 节点缓冲区没有正确下载文件?
- amazon-web-services - 可以跨账户 Kinesis Firehose 吗?