iOS开发-委托(Delegate)浅谈

简介:

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

简单的委托

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

1
2
3
4
5
6
7
@protocol  BookDelegate < NSObject >
@required
- ( void )getBookCount;
@optional
- ( void )optionMethod;
 
@end

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

1
2
3
4
5
6
7
8
9
@interface  Book :  NSObject <BookDelegate>
 
@end
 
@interface  Customer :  NSObject <BookDelegate>
 
@property  (assign, nonatomic id <BookDelegate> didBookDelegate;
 
@end

 实现其中的getBookCount方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@implementation  Book
 
- ( void )getBookCount{
     NSLog (@ "Book中getBookCount的实现" );
}
 
@end
 
@implementation  Customer
 
- ( void )getBookCount{
     NSLog (@ "Customer中getBookCount的实现" );
}
 
@end

简单的调用:

1
2
3
4
5
6
7
Book *book=[[Book alloc]init];
 
Customer *customer=[[Customer alloc]init];
 
[customer getBookCount];
 
[book getBookCount];

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

1
2
3
customer.didBookDelegate=book;
 
[customer.didBookDelegate getBookCount];

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

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

页面传值

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

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

第一个页面ViewController的定义:

1
2
3
4
5
6
7
8
9
10
11
12
#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头文件的定义,并且声明了一个委托:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//
//  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中的点击事件:

1
2
3
4
5
6
7
8
9
- ( 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就是第二个视图定义的属性:

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

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

1
[ self .firstViewDelegate shouldChangeValue: self ];

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

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4271275.html,如需转载请自行联系原作者

相关文章
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
84 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
6天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
9 0
|
21天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
2月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
196 2
|
3月前
|
数据可视化 iOS开发
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
iOS 开发,什么是 Interface Builder(IB)?如何使用 IB 构建用户界面?
40 4
|
3月前
|
iOS开发
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
iOS开发解释 App 生命周期,包括各个阶段的调用顺序。
28 1
|
iOS开发
iOS开发那些事-iOS常用设计模式–委托模式
<p>对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析。当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式、委托模式、观察者模式、MVC模式。</p> <p><span id="more-129"></span></p> <p>委托模式</p> <p>委托模式从GoF 设计装饰(Decorator)、适配器(Adapter)和模板方法(T
1314 0
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
39 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
91 2