Swift中的协议和授权

时间:2015-07-20 16:25:04

标签: ios swift

我试图在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上的方法。

2 个答案:

答案 0 :(得分:1)

有几件事:

  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
    }
    
  2. 通过cellDelegate属性weak确保您没有强大的参考周期:

    weak var cellDelegate: CellProtocol!
    
  3. 要允许您对协议类型进行弱引用,您必须使协议成为class协议:

    protocol CellProtocol : class {
        func onSwitchToggle (sender : AnyObject, onCell : UITableViewCell)
    }
    
  4. 如果委托已设置(使用可选链接),您显然只想调用onSwitchToggle

    @IBAction func toggle(sender: AnyObject) {
        cellDelegate?.onSwitchToggle(sender, onCell: self)
    }
    

    不需要进行测试以确保委托实现了该方法,因为如果视图控制器符合协议,则必须实现该方法。

  5. 请原谅我,但我更改了一个方法名称(切换到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

    }