如何在自定义UITableViewCell

时间:2016-10-06 10:00:33

标签: ios swift uitableview uiswitch

虽然我发现了类似的问题,但我无法理解它的答案。

我们如何阅读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)

有关如何实施此建议的任何建议吗?

2 个答案:

答案 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)