闭包传值

闭包传值

swift开发中常常遇到控制之间传值的问题,在oc中我们可以用通知、代理、block来传值。在oc的block传值很方便,缺点就是只能回调传值,如果要传多个控制器只能用通知了。
而在swift中我们也可以用通知、代理来传值,但那样太麻烦了,swift有个很方便的回调叫闭包(closure)。
swift闭包和oc的block很类似,它可以做方法的回调也可以用来做两个界面之间的传值,也可以叫两个界面的反向传值(既回调)。

两个界面的传值

我们要实现点击第二个界面后,关掉第二个界面,并且传值给第一个界面

首先在第二个界面声明闭包进行操作

class NewViewController: UIViewController {
    //声明闭包
    typealias lewisCloser = (_ paramOne : String? ) -> ()
    //定义个变量 类型就是上面声明的闭包
    var customeCloser: lewisCloser?
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if(customeCloser != nil) {
            customeCloser!("要发给第一个界面的值")
        }
        self.dismiss(animated: true, completion: nil)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

在第一个界面实现闭包,回调值

let vc = NewViewController()
//实现闭包
vc.customeCloser = {(cusValue) -> () in
      //cusValue就是传过来的值
      print("第二个界面:\(cusValue!)")
 }
self.present(vc, animated: true, completion: nil)

控制器获取tableView的Cell中的collection的item点击路径
tableView的Cell的闭包操作

    class TableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    //声明闭包
    typealias clickCloser = (_ cellPath:IndexPath) -> ()
    //定义个变量 类型就是上面声明的闭包
    var customeCloser: clickCloser?

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

    extension TableViewCell: UICollectionViewDelegate {
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

            if(customeCloser != nil) {
                customeCloser!(indexPath)
        }
    }
}

控制器取得回调值

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

         let cell = tableView.dequeueReusableCell(withIdentifier: LFWorkbenOneCell.identifier(), for: indexPath) as! LFWorkbenOneCell
            cell.customeCloser = {(cellPath)->() in
                print("第一组的 \(cellPath.row)")
    }
            return cell
}
-------------本文结束感谢您的阅读-------------