我试图在Swift中制作协议和委托,但我遇到了一些问题。我想在表格视图的单元格中有一个切换按钮。这是我的协议:
import Foundation
import UIKit
protocol CellProtocol {
func onSwitchToogle (sender : AnyObject , onCell : UITableViewCell)
}
这是我的手机课程:
import UIKit
class Cell: UITableViewCell {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var flag: UISwitch!
var cellDelegate:CellProtocol!
@IBAction func Toogle(sender: AnyObject) {
if((cellDelegate?.onSwitchToogle(sender, onCell: self)) != nil){
}
}
}
这是我的ViewController:
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, CellProtocol {
func onSwitchToogle(sender: AnyObject, onCell: UITableViewCell) {
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! Cell
cell.label.text = "sadsad"
return cell
}
}
问题是:它永远不会进入我的交换机的IBAction中的if条件,它永远不会进入ViewController上的方法。
答案 0 :(得分:1)
有几件事:
您希望确保在cellForRowAtIndexPath
中指定代理:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! Cell
cell.cellDelegate = self
cell.label.text = "sadsad"
return cell
}
通过cellDelegate
属性weak
确保您没有强大的参考周期:
weak var cellDelegate: CellProtocol!
要允许您对协议类型进行弱引用,您必须使协议成为class
协议:
protocol CellProtocol : class {
func onSwitchToggle (sender : AnyObject, onCell : UITableViewCell)
}
如果委托已设置(使用可选链接),您显然只想调用onSwitchToggle
:
@IBAction func toggle(sender: AnyObject) {
cellDelegate?.onSwitchToggle(sender, onCell: self)
}
不需要进行测试以确保委托实现了该方法,因为如果视图控制器符合协议,则必须实现该方法。
请原谅我,但我更改了一个方法名称(切换到toogle,用小写字母开始方法名称等),但希望这说明了关键点。
答案 1 :(得分:0)
在cellForRowAtIndexPath中将委托设置为self:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! Cell
cell.label.text = "sadsad"
cell.cellDelegate = self
return cell
}