委托其实并不是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. Linux 的文件权限与目录配置

    用户和用户组 文件所有者 (owner) 用户组概念 (group) 其他人概念 (others) Linux文件权限概念 1. Linux文件属性 要了解Linux文件属性,那么有个重要的命令必须提 ...

  2. (视频)asp.net core系列之k8s集群部署视频

    0.前言 应许多网友的要求,特此录制一下k8s集群部署的视频.在录制完成后发现视频的声音存在一点瑕疵,不过不影响大家的观感. 一.视频说明 1.视频地址: 如果有不懂,或者有疑问的欢迎留言.视频分为两 ...

  3. [ 原创 ] Java基础9--final throw throws finally的区别

    final修饰的类不可被继承,final修饰的方法可以被继承但不能被重写(覆盖) final用于可以声明属性和方法,分别表示属性的不可变及方法的不可覆盖.不是方法的不可继承 throw是用来明确地抛出 ...

  4. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...

  5. 最新OFFICE 0day漏洞分析

    漏洞概述 fireeye最近公布了一个OFFICE 0day,在无需用户交互的情况下,打开word文档就可以通过hta脚本执行任意代码.经过研究发现,此漏洞的成因主要是word在处理内嵌OLE2LIN ...

  6. bzoj 3672 利用点分治将CDQ分治推广到树型结构上

    最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...

  7. BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  Solved: 2xx 题目连接 http:/ ...

  8. C#高级编程9-第2章 核心C#

    C#基础 使用C#命名编译器csc.exe,编译C#程序 变量 变量一般初始化后才能使用 类型判断弱类型var,根据初始值判断类型, 变量作用域,可以访问该代码的区域 类中定义的成员变量和属性,作用在 ...

  9. Windows下ftp服务器搭建及配置

    Win系统使用ser-u软件进行FTP服务器的搭建下载地址:https://www.serv-u.com/操作步骤如下:1. 点击执行程序进行按照SU-FTP-Server-Windows-v15.1 ...

  10. 使用清华大学开源软件镜像AOSP的“每月更新初始化包”更新指定版本的Android源码

    参照官方教程:Tsinghua Open Source Mirror 1. 下载了repo工具 mkdir  ~/bin PATH = ~/bin:$PATH curl  https://storag ...