委托其实并不是OC中才有,C#中也有,不过彼此的理解方式是不一样的,OC中委托是协议的一种,需要使用@protocol声明,委托一般在iOS开发中页面中传值用的比较多。委托是Cocoa中最简单、最灵活的模式之一,委托其实字面上的意思就是将需要的事情委托给别人做,业务场景可以参考主视图和子视图之间的页面关系,或者是视图层和数据层之间的交互。

简单的委托

委托通过@protocol声明,可以定义方法,引用委托的对象,需要实现其方法,方法默认都是@required的,同时可以设置为可选的@optional,首先定义个委托:

@protocol BookDelegate <NSObject>
@required
- (void)getBookCount;
@optional
- (void)optionMethod; @end

这个时候定义书籍Book类和客户Customer类:

@interface Book : NSObject<BookDelegate>

@end

@interface Customer : NSObject<BookDelegate>

@property (assign,nonatomic) id<BookDelegate> didBookDelegate;

@end

 实现其中的getBookCount方法:

@implementation Book

- (void)getBookCount{
NSLog(@"Book中getBookCount的实现");
} @end @implementation Customer - (void)getBookCount{
NSLog(@"Customer中getBookCount的实现");
} @end

简单的调用:

    Book *book=[[Book alloc]init];

    Customer *customer=[[Customer alloc]init];

    [customer getBookCount];

    [book getBookCount];

  上面几行的代码的结果,不用说大家也能看的懂,接下来看接下来的代码,这个时候大家发现用到了开始顶一个的didBookDelegate:

     customer.didBookDelegate=book;

    [customer.didBookDelegate getBookCount];

 上面就是将Book的实例,Book实现了BookDelegate,这个时候可将Book的实例赋值给customer中的变量,将自己的实例化对象委托给了didBookDelegate。

以上是委托使用基本的场景,作为实例化对象book可以自己执行其方法,也可以通过委托将执行过程转移。

页面传值

简单的就是A页面数据可以传值给B页面,B页面可以传值给A页面,简单的两个页面传值,页面参考如下:

都是文本框和按钮,跳转方式选取的时Modal:

第一个页面ViewController的定义:

#import <UIKit/UIKit.h>
#import "SecondViewController.h" @interface ViewController : UIViewController<StudySubjectDelegate> @property (strong, nonatomic) IBOutlet NSString *firstData; @property (weak, nonatomic) IBOutlet UITextField *subjectName; @end

 第二个页面SecondViewController头文件的定义,并且声明了一个委托:

//
// SecondViewController.h
// Sample
//
// Created by keso on 15/2/3.
// Copyright (c) 2015年 keso. All rights reserved.
// #import <UIKit/UIKit.h> @class SecondViewController;
@protocol StudySubjectDelegate <NSObject> - (void)shouldChangeValue:(SecondViewController*)controller; @end @interface SecondViewController : UIViewController @property (assign,nonatomic) id<StudySubjectDelegate> firstViewDelegate; @property (weak, nonatomic) IBOutlet NSString *showData; @property (weak, nonatomic) IBOutlet UITextField *studySubject; @end

 ViewController.m中的点击事件:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"firstEdit"]) {
SecondViewController *controller=segue.destinationViewController;
NSLog(@"%@",self.subjectName.text);
//将自己本身的实例传递给第二个视图
controller.firstViewDelegate=self;
controller.showData=self.subjectName.text;
}
}

 赋值的方式还可以是这样的,其实中的key就是第二个视图定义的属性:

        if ([controller respondsToSelector:@selector(setShowData:)]) {
[controller setValue:self.subjectName.text forKey:@"showData"];
}

第二个页面的点击事件就比较简单了,代码如下:

    [self.firstViewDelegate shouldChangeValue:self];

上面中其实可以简单的看到oc中的委托就是将自己的实例交给其他对象的成员变量,然后由其成员变量执行实例的工作,的今天不知道为什么有点头疼,说个事情就是最后的第二个页面跳转到一个页面可以接收到值,无法给UITextField赋值,暂时没有搞明白如何才能赋值上去,每次进入就变成了null,有知道可以指点一下,多谢~

iOS开发-委托(Delegate)浅谈的更多相关文章

  1. iOS 传值 委托(delegate)和block 对比

     技术交流新QQ群:414971585 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和block是IOS上实现回调的两种机制.Block基本可以代替委托的功能,而且实 ...

  2. iOS之内存管理浅谈

    1.何为ARC ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1,在对象被re ...

  3. IOS开发----委托机制

    委托模式从GoF装饰模式.适配器模式和模板方法等演变过来,几乎每一个应用都会或多或少的用到委托模式. 在古希腊有一个哲学家,他毕生只做三件事情:“睡觉”.“吃饭”.和“工作”.为了更好的生活,提高工作 ...

  4. ios 设置委托delegate

    为了进行页面传值,也可以用委托的方法. 下面以时间控件为例. 1.首先,在.h 文件设置委托 #import <UIKit/UIKit.h> @protocol DatePickerVie ...

  5. iOS开发-委托实战

    昨天晚上头疼,写了一部分草草的收笔了,早上起来补发一篇文章,昨天关于委托的基本使用和概念都稍微讲了一下,最开始学习委托的时候苹果官网和中文的博客文章看了不少,相似指数比较高.委托在命名要准确,最好是一 ...

  6. Android开发学习之浅谈显示Intent和隐式Intent

    Intent寻找目标组件的两种方式: 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的. 隐式Intent:通过Intent ...

  7. iOS开发系列-ARC浅解

    一.什么是 ARC ? 所谓ARC就是Automatic Reference Counting , 即自动引用计数.ARC是自iOS5引入的.ARC机制的引入是为了简化开发过程的内存管理的.相对于之前 ...

  8. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  9. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

随机推荐

  1. Hadoop错误1(Text类型与String类型)

    在此类的博客中,博主主要记录的是在Hadoop实践过程中遇到的一些错误,先上一个代码 protected void map(Object key,Text value, Context context ...

  2. [CodeChef - STREETTA] The Street 李超线段树

    大致题意: 给出两个序列A,B,A初始为负无穷,B初始为0,有三种操作 1.在A上区间[u,v]上加一个等差数列,取与原本A序列的最大值. 2.在B上区间[u,v]上加一个等差数列. 3.给出一个点X ...

  3. python sys.argv[]的用法简明解释

    sys模块中文参考文档:http://xukaizijian.blog.163.com/blog/static/170433119201111625428624/ sys.argv[]: 「argv」 ...

  4. 利用python制作电子签名

    有时候我们需要在文档里粘上电子签名,通常使用photoshop制作,但是通常photoshop软件还需要下载.安装,对于不经常使用的人来说,单独装这个软件没啥必要. 因此我们可以利用python对签名 ...

  5. QT学习笔记3:QT中语法说明

    一.Qt 类中Q_OBJECT的作用 QObject 是所有Qt对象的基类. QObject 是Qt模块的核心.它的最主要特征是关于对象间无缝通信的机制:信号与槽.使用connect()建立信号到槽的 ...

  6. [BZOJ5298][CQOI2018]交错序列(DP+矩阵乘法)

    https://blog.csdn.net/dream_maker_yk/article/details/80377490 斯特林数有时并没有用. #include<cstdio> #in ...

  7. 【枚举】【二分】Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) D. Resource Distribution

    题意:有两个服务要求被满足,服务S1要求x1数量的资源,S2要求x2数量的资源.有n个服务器来提供资源,第i台能提供a[i]的资源.当你选择一定数量的服务器来为某个服务提供资源后,资源需求会等量地分担 ...

  8. Tomcat CVE-2017-12615 远程上传漏洞复现

    漏洞名称:CVE-2017-12615-远程代码执行漏洞 CVE-2017-12615:远程代码执行漏洞 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 r ...

  9. python调用matlab

    官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...

  10. 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)

    下面来谈谈书中的第二部分,用Interface Classes来降低编译的依赖.从上面也可以看出,避免重编的诀窍就是保持头文件(接口)不变化,而保持接口不变化的诀窍就是不在里面声明编译器需要知道大小的 ...