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

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)
}

3.2AppDelegate.swift

//
//  AppDelegate.swift
//  modelViewDemo
//
//  Created by 赵超 on 14-6-26.
//  Copyright (c) 2014年 赵超. All rights reserved.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        // Override point for customization after application launch.
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        var root=RootViewController()

        self.window!.rootViewController=root

        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

}

3.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.
    }

}

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

时间: 2024-12-26 08:12:41

swift 用协议实现代理传值功能的相关文章

利用Swift之协议语法实现页面间的传值功能

随着Swift 新开发语言的发布,又随着Xcode6.0.1的正式发布,利用swift编写iOS代码迫在眉睫,笔者在使用Objective-C开发近三年以来,对这种优雅的语法深感赞叹,下面我将对比式的实现一个页面传值的demo,使用语法是swift,页面传值是学习iOS初期必修的demo,因为涉及一个非常难懂的语法:协议和委托,这里涉及的swift语法和一些基本操作我不在一一赘述,如果方便可下载IT面试宝典APP,里面有对其详细介绍,那就开门见山吧,用代码实现以下功能: 1,创建Swift工程,

SWIFT语言实现代理传值/闭包传值

1.需求:利用代理实现反向传值(例子采用点击第二个视图控制器中的按钮来改变第一个视图控制器中的Label的内容) 一.第一个界面 1 class ViewController: UIViewController, ChangeTestLabelDelegate { 2 var testLabel: UILabel? 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after lo

swift -NavigationController,代理传值

// // ViewController.swift // NavigationController // import UIKit import Foundation class ViewController: UIViewController,FontSizeChangDelegate { var myLabel :UILabel?;//声明一个UILabel对象 全局的 override func viewDidLoad() { super.viewDidLoad() //self.tit

窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流>等博客内容中都用到的Delegate回调.说到协议,在Objective-C中也是有协议的,并且Swift中的协议和Objc中的协议使用起来也是大同小异的,在Java等现代面向对象编程语言中有接口(Interface)的概念,其实和Swift中或者Objc中的Protoco

iOS传值之代理传值

iOS中传值方式有好几种,分别是:代理传值,block传值,属性传值,通知传值,单例传值,利用userdefault或者文件方式传值,通常代理传值和block传值使用最普遍,本文介绍代理传值的方式,后续博客会一次写上其他传值方式. 一 什么是委托代理? 1.协议(protocol),就是使用了这个协议后,必须按照协议规定的内容来处理事情,协议中要求的方法必须实现(@optional的方法除外). protocol是一种语法,它提供了一个很方便的.实现delegate模式的机会. 定义protoc

【IOS开发之Objective-C】协议和代理

在现实生活中我们存在各种各样的协议,但是都有一个共同点,就是拟定的协议,就要遵守,不遵守就是违约.在OC中也有协议这一个概念而且和我们现实生活中的协议的特点是类似的.有时我们自己想做什么事,但是现在没这个能力自己去做,亲力亲为,我们就需要找代理来帮我们做了.那么在OC中也有代理这个概念.下面就简单的说说OC中的协议和代理. 一.协议 在<[IOS开发之Objective-C]对象的交互>中实现了一种对象的交互的方式.在OC中还有其他方式,比如说协议,在OC中用协议来规范接口,是实现对象之间的交

iOS中多视图的传值 属性传值和代理传值

首先创建两个类 ,FirstViewController和SecondViewController,都继承于UIViewController 1 #import "AppDelegate.h" 2 #import "FirstViewController.h" 3 4 @interface AppDelegate () 5 6 @end 7 8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIAp

iOS基础——浅谈个人对协议、代理的理解

阅读前的知识储备 请确保在阅读本文时,曾经不止一次亲自动手敲过有关代理模式的代码.如果没有,请在积累一定的经验后阅读,相信会更有收获.也希望大神不吝指教. 什么时候要用协议和代理? 下面举一个例子,谈谈个人对代理.协议的理解,希望能够起到抛砖引玉的效果. 假设现在有这么一个任务需求:页面A需要跳转到页面B(有可能会传入一些参数),页面B填写或者处理一些信息在跳转回页面A的同时还需要把数据返回A. 不要为了用代理模式而用代理模式 代理模式只是一种设计模式,它的价值在于通过一个统一的模式,解决一个原

iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)

(一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers和一个DetailViewControllers,在DetailViewControllers中声明一个textString属性,用于接收传过来的字符串, (三)代理传值 RootViewControllers页面push到DetailViewControllers页面,如果DetailViewControllers页面的信息想回传(回调)到RootViewCo