swift 用协议实现代理传值功能

个人理解: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.
    }



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值