文档章节

iOS如何利用Delegate来实现两个UIView之间的传值

黑衣李白
 黑衣李白
发布于 2013/01/05 16:03
字数 873
阅读 2001
收藏 3

两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。

设想一个场景:

1. 有两个View,分别是A和B。

2. 点击A中的某个按钮,出来B。

3. 对B做某些操作(比如输入文字到textField,选择picker等等)。

4. 然后点击B中的确定按钮,将在B中进行的操作所产生的数据传递给A。

这种应用场景在编写iPhone App应用的时候是十分常见的,比如利用modelview来进行某些条件的选择,进行注册操作等等。下面具体说说利用Delegate是如何将View B中的数据传递回View A。

第一步:

在B类的类定义之前加入一下代码,定义一个delegate:

@protocol ViewBControllerDelegate <NSObject>   
- (void) viewAWillDoThisAction:(UIViewController *) currentView;     
@end

这个delegate定义了一个方法,所有实现了这个delegate的类都必须实现这个方法。

然后再在B类的类定义中添加一个member,加入以下代码:

NSObject<FilterSpotsViewControllerDelegate> *view_A;

从名字来看,就知道待会这个值会被赋予View A。

第二步:

让A类实现ViewBControllerDelegate:

@interface ViewAController : UIViewController <ViewBControllerDelegate>

并且让A类实现方法viewAWillDoThisAction:

- (void) viewAWillDoThisAction:(UIViewController *) view_B {  
   //利用view_B来传值。如self.a = view_B.a;  
}


上面代码中,将会在B类中将B类自己(self)的指针传递给view_B(见下面第四步)。这样就可以把B类的数据传递给A类了。

第三步:

就如我之前所说的,View A点某个按钮之后,出现View B。假设这个按钮对应的方法是“-(void) pushViewB: (id) sender"。那么应在这个方法中将A类自身的指针(self)传递给之前第一步在B类中定义的成员变量View_A:

-(void) pushViewB: (id) sender {     
    //初始化一个B类,view_B      
    view_B.view_A = self;   //赋值  
    //推出View B  
}


第四步:

在B类,假设在View B中做完所有操作之后,点击确定按钮,返回View A,并将数据传回给view A。假设这个确定按钮的方法是-(void)done: (id) sender。那么需要在这个方法中调用A类实现的viewAWillDoThisAction:

-(void) done: (id) sender {  
[self.view_A viewAWillDoThisAction:self];  
//返回View A  
}

上面代码注意两个问题:第一是调用view A的实现了delegate的方法,第二是将自身的指针传递给view A的方法,以方便view A能取到view B的数据。

以上就是整个利用delegate机制来进行两个view之间的传值的过程。这里注意一点:这两个view之间是有关系的(view A推出view B,从view B推出view A)。对于两个完全没有关系的view,如何传值呢?理论上利用delegate也是可以的,但并不是最好的方法。最好的方法是利用NSNotification,留到日后再说。

多嘴一点,其实说是利用delegate的方式来传值,其本质是传递类的指针来进行类成员的传值(实现了delegate的类A将自身传给了类B,然后类B又将自身传回去给类A),之所以用到delegate的机制,只不过是为了说明这个顺序:当B进行了某个操作的时候,需要A去做另外一件事。这就是delegate的本质。也就是我文章开头所说“最合理最自然”的原因。


本文转载自:http://blog.csdn.net/whaomian/article/details/6802162#

黑衣李白
粉丝 34
博文 28
码字总数 40536
作品 0
朝阳
程序员
私信 提问
iOS学习笔记:iOS应用程序的窗口元素及其运行原理

一、应用程序窗口元素 UIWindow:每一个应用程序都有属于自己的UIWindow,UIWindow继承自UIView UIView:视图,屏幕上可视的控件都是UIView,如按钮、文本标签、表格 UIViewController:控制...

寂无声
2013/11/03
0
0
iOS应用程序的窗口元素及其运行原理

一、应用程序窗口元素 UIWindow:每一个应用程序都有属于自己的UIWindow,UIWindow继承自UIView UIView:视图,屏幕上可视的控件都是UIView,如按钮、文本标签、表格 UIViewController:控制...

开发小菜鸟一枚
2013/11/06
0
0
iOS 如何选择delegate、notification、KVO?

delegate、notification和KVO的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的分析了三者之间的区别以及各自的优势,博文地址为http://blog.shinetech...

神补刀
2015/08/22
0
0
IOS 如何选择delegate、notification、KVO?

前面分别讲了delegate、notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细的...

雾灵峰
2013/03/24
0
0
iOS 滚动视图编程指南

iOS 应用中的 Scroll view 用来显示和让用户操作大小超出屏幕显示范围的内容。Scroll view 主要有两个用途: 让用户拖动到他们想要显示的内容区域 让用户用双指手势放大、缩小 下图是一个典型...

灰大羊
2014/04/17
593
2

没有更多内容

加载失败,请刷新页面

加载更多

缓存雪崩

缓存雪崩原因:大批次的缓存数据,同一时刻过期 解决方案: 1、尽可能避免所有缓存在同一时刻过期,即:合理调整过期策略 2、对条件加锁 伪代码: public ProductselectProduct(String id){ ...

少年已不再年少
43分钟前
7
0
所以说这才是Redis进化史吗?看Redis是如何变成最强缓存的

写在前面:笔者翻阅了很多资料,只能找到Redis2.2及以后的主要版本的发布日志。所以,让我们从2.2开始一步一步深入了解Redis。 2.2 redis-cli命令非常大的改进: Tab补全,支持help(例如help ...

Java干货分享
今天
7
0
manjaro抽风,/usr/lib/modules目录丢失

现象 2019年6月16日这周,突然发现manjaro抽风: 先是启动时无法加载一些内核模块,导致启动失败 然后用启动盘重新pacman -S linux,第一次启动是好的,再启动就有问题了 原因 翻来覆去搞不定...

chuqq
今天
5
0
MyClouds-2.0-RC 发布,企业级微服务平台

MyClouds企业级微服务平台 MyClouds-V2.0-RC 已发布。 更新如下 [优化] 重构了系统架构。(移除myclouds-admin-webserver工程,停用后端thymeleaf模版引擎,前后端彻底分离;移除了myclouds-...

xiongchun
今天
1
0
Wine-Staging 4.9 发布,增添一些新补丁

Wine-Staging的工作还在继续,到4.9版为止,在上游Wine代码库上有超过830个补丁。 在上周五的Wine 4.9发布之后,Wine-Staging 4.9已经发布了,之前的一些暂存工作现在围绕Windows编解码器和D...

linuxCool
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部