个人理解:A通过协议把自身代理给B运行。在B里面实现代理A协议里面的方法。以实现A数据操作的目的。
其中,数据的协议方法可以为闭包。实现自定义数据操作。
1.功能简介
RootViewController中用个lable和一个按钮,点击按钮跳转到模态窗口。在模态窗口中有个TextField和一个按钮,输入文字点击关闭模态按钮后跳转到RootViewController,并改变其label为输入的值。
2 .实现思路
ModelViewController中定义一个成员变量,成员变量有个能改变label值的函数,通过在ModelViewController中调用该函数从而改变RootViewController中label的值,因为ModelViewController自身不能直接改变RootViewController中的成员变量,所以在ModelViewController中定义一个代理,该代理由RootViewControler来实现
3.代码
3.1Protocol.swif
//
// Protocol.swift
// modelViewDemo
//
// Created by 赵超 on 14-6-26.
// Copyright (c) 2014年 赵超. All rights reserved.
//
import Foundation
//协议,定义代理要实现的方法
protocol ModeViewControlDelegate{
func changeLabel(newString:String)
}
3RootViewController.swift
// // RootViewController.swift // modelViewDemo // // Created by 赵超 on 14-6-26. // Copyright (c) 2014年 赵超. All rights reserved. // import UIKit // 实现ModeViewControlDelegate协议 class RootViewController: UIViewController,ModeViewControlDelegate { var btn:UIButton? var label:UILabel? //实现协议中的方法 func changeLabel(newString:String){ self.label!.text=newString } //按钮事件 func btnOnClick(){ println("Onclick") var modeView = ModelViewController() //设置modeView中的代理为RootViewController自身 modeView.delegate=self //跳转到ModelView self.presentViewController(modeView, animated: true , completion: { println("OK") }) } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor=UIColor.grayColor() label=UILabel() label!.frame=CGRectMake(110,40,100,20) label!.backgroundColor=UIColor.greenColor() label!.text="hello world!" label!.textAlignment = .Center btn=UIButton(frame:CGRectMake(110,80,100,20)) btn!.backgroundColor=UIColor.greenColor() btn!.setTitle("打开模态",forState:.Normal) btn!.addTarget(self,action:"btnOnClick",forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(btn) self.view.addSubview(label) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ }
3.4ModelViewController.swift
// // ModelViewController.swift // modelViewDemo // // Created by 赵超 on 14-6-26. // Copyright (c) 2014年 赵超. All rights reserved. // import UIKit class ModelViewController: UIViewController { var textF:UITextField? // 代理成员变量 var delegate:ModeViewControlDelegate? //按钮点击事件 func btnOnClick(){ var str=textF!.text println(str) //调用代理函数,改变Label值 self.delegate!.changeLabel(str) //返回RootView self.dismissModalViewControllerAnimated( true) } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor=UIColor.blueColor() textF=UITextField() textF!.frame=CGRectMake(110,40,100,20) textF!.backgroundColor=UIColor.greenColor() textF!.borderStyle = .RoundedRect var btn=UIButton(frame:CGRectMake(110,80,100,20)) btn.backgroundColor=UIColor.greenColor() btn.setTitle("关闭模态",forState:.Normal) //绑定事件 btn.addTarget(self,action:"btnOnClick",forControlEvents: UIControlEvents.TouchUpInside) self.view.addSubview(btn) self.view.addSubview(textF) // Do any additional setup after loading the view. } }