Swift 使用代理和闭包(closure)反向传值
FirstViewController的代码
import UIKit class FirstViewController: UIViewController, SecondViewControllerDelegate { @IBOutlet weak var showTextLabel: UILabel! @IBOutlet weak var showDelegateTextLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } //点击按钮跳转到SecondViewController @IBAction func tapGoSecondViewController(sender: UIButton) { //从storyboard上加载SecondViewController let secondVC = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("secondViewController") as! SecondViewController //实现回调,获取回调回来的值 (闭包) secondVC.backClosure = { (backStr: String) -> Void in self.showTextLabel.text = backStr } secondVC.delegate = self //跳转到SecondViewController self.navigationController?.pushViewController(secondVC, animated: true) } //MARK: - SecondViewControllerDelegate(代理) func fetchBackString(str: String) { self.showDelegateTextLabel.text = str } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
SecondViewController的代码
![](https://images2015.cnblogs.com/blog/789646/201601/789646-20160121225401484-251908832.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import UIKit //定义闭包类型(特定的函数类型函数类型) typealias InputClosureType = (String) -> Void protocol SecondViewControllerDelegate: NSObjectProtocol { func fetchBackString(str: String) } class SecondViewController: UIViewController { @IBOutlet weak var inputTextField: UITextField! //接收上个页面传过来的闭包块 var backClosure: InputClosureType? weak var delegate: SecondViewControllerDelegate? override func viewDidLoad() { super .viewDidLoad() // Do any additional setup after loading the view. } @IBAction func tapBackButton(sender: UIButton) { if self .backClosure != nil { if let tempString = self .inputTextField.text { self .backClosure!(tempString) } } self .navigationController?.popViewControllerAnimated( true ) } @IBAction func delegateBackMethod(sender: UIButton) { if self .delegate != nil { if let tempString = self .inputTextField.text { delegate!.fetchBackString( "代理返回数据:\(tempString)" ) } } self .navigationController?.popViewControllerAnimated( true ) } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
效果视图:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步