虽然我发现了类似的问题,但我无法理解它的答案。
我们如何阅读UISwitch
中的更改或UITableViewCell
中的任何元素?尝试使用协议,但自定义单元类抱怨没有初始化。使用,委托,似乎不符合视图控制器。
protocol SwitchTableViewCellDelegate {
func didChangeSwitchValue(value: Bool)
}
class SwitchTableViewCell: UITableViewCell {
var delegate: SwitchTableViewCellDelegate
var value: Bool = true
@IBOutlet weak var switchCellLabel: UILabel!
@IBOutlet weak var switchCellSwitch: UISwitch!
@IBAction func changedSwitchValue(sender: UISwitch) {
self.value = sender.on
delegate.didChangeSwitchValue(value)
}
在cellForRowAtIndexPath
,
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
cell.delegate = self
cell.switchCellLabel?.text = "Show Cloud Music"
cell.switchCellSwitch.on = userDefaults.boolForKey(cloudMusicKey)
有关如何实施此建议的任何建议吗?
答案 0 :(得分:5)
我建议使用Swift闭包。在您的单元格类中使用以下代码:
class SwitchTableViewCell: UITableViewCell {
var callback: ((switch: UISwitch) -> Void)?
var value: Bool = true
@IBOutlet weak var switchCellLabel: UILabel!
@IBOutlet weak var switchCellSwitch: UISwitch!
@IBAction func changedSwitchValue(sender: UISwitch) {
self.value = sender.on
callback?(switch: sender)
}
然后在cellForRowAtIndexPath
:
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
cell.callback = { (switch) -> Void in
// DO stuff here.
}
cell.switchCellLabel?.text = "Show Cloud Music"
cell.switchCellSwitch.on = userDefaults.boolForKey(cloudMusicKey)
答案 1 :(得分:1)
首先,由于可以有许多单元共享同一个委托,因此委托应该知道哪个单元调用它。因此,您的协议方法应该提供单元本身,而不仅仅是它的开关值。实际上,我们可以省略switch值参数,因为它可以从单元格中查询。
protocol SwitchTableViewCellDelegate {
func switchTableViewCellDidChangeSwitchValue(cell: SwitchTableViewCell)
}
在代理方法的协议方法实现中,您可以像这样访问交换机值:
func switchTableViewCellDidChangeSwitchValue(cell: SwitchTableViewCell) {
let switchValue = cell.value
}
其次,delegate属性可以为nil,因此其类型必须为Optional
。
var delegate: SwitchTableViewCellDelegate?
在value
更改时调用代理:
delegate?.switchTableViewCellDidChangeSwitchValue(self)