闭包传值
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
}