转至:http://blog.csdn.net/whaomian/article/details/6802162
两个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<ViewBControllerDelegate > *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的本质。也就是我文章开头所说“最合理最自然”的原因。
分享到:
相关推荐
本篇将详细介绍如何在两个ViewController之间利用委托协议进行值传递,以及它与Android中`onActivityResult`方法的相似之处。 首先,我们需要理解什么是委托协议。在Objective-C或Swift中,委托是一种设计模式,...
在这个主题中,我们将深入探讨如何利用Delegate来在Objective-C或Swift中传递数据。 一、Delegate的基本概念 Delegate是一种协议,定义了一组方法,实现该协议的类可以接收并处理特定的消息。在iOS应用中,通常一个...
本文将深入探讨如何在iOS的视图之间使用Delegate来实现数据的传递,以及相关源码和工具的应用。 一、Delegate协议的原理与设置 Delegate协议本质上是一种设计模式,它定义了一组方法,让一个对象(通常被称为委托...
在iOS应用中,Delegate经常用于控制器间的通信,如UIViewController和UITableView之间的数据传递。本文将通过一个简单的Demo,深入浅出地解释Delegate的使用和其在iOS开发中的作用。 首先,我们要明确Delegate的...
本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下: 关于Delegate【代理、委托】是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名...
标题“两个controller相互传值”和描述“iOS实现在两个ViewController间传值”都指向了这个核心主题。在这个场景下,我们可以使用两种主要的方法:协议(Protocol)传值和控制器(Controller)传值。下面我们将详细...
标题提到的"IOS界面之间通过委托传值"是一种常用且灵活的方法,它基于Objective-C或Swift的委托设计模式(Delegate Pattern)。这种模式允许一个对象(在这里是发送者)通知另一个对象(接收者)关于某些事件或操作...
"ios 通过delegete委托 在两个界面进行传值"这个标题涉及的关键知识点是使用委托(Delegate)协议来实现在多个界面之间的数据传递。下面将详细介绍这一过程,并给出实际操作步骤。 首先,我们需要理解什么是委托...
本文将详细介绍如何在两个ViewController之间实现数据的传递,主要聚焦于基本的Objective-C编程环境,适用于初学者和有一定经验的开发者。 首先,让我们理解ViewController间的通信机制。在iOS中,有多种方法可以...
在本示例中,“Delegate实现传值”主要探讨的是如何利用Delegate在两个界面上进行数据传递,尤其是从第二个界面向第一个界面传递数据。 在Windows Forms或WPF等UI开发中,通常我们需要在不同的界面或控件之间传递...
C# WPF 通过委托实现多窗口间的传值方法 ...使用委托来实现多窗口间的传值是一种非常有效的方法,可以使得窗口之间的交互更加灵活和可维护。通过本文,我们了解了委托的基本概念和使用方法,并实现了多窗口间的传值。
在iOS开发中,传值是应用之间或组件之间通信的关键技术。本文将深入探讨iOS中最常用的几种传值方式,包括Block、Delegate、属性赋值、代理协议以及Notification Center。了解并熟练掌握这些方法,能够帮助开发者更加...
本文将深入探讨`ios delegate 传值`这一主题,结合给出的博客链接(已失效,但我们可以根据常规实践进行讲解)以及DelegateDemo示例项目,来详细介绍如何在Objective-C或Swift中使用Delegate来传递数据。 首先,...
在iOS应用中,我们经常用代理来传递数据或事件,特别是在两个不直接相关或者不想直接耦合的对象之间。例如,一个视图控制器可能需要知道用户在表视图中进行了哪些操作,这时就可以通过定义一个代理来实现。 在这个...
在iOS开发中,Delegate是一种常见的对象间通信方式,主要用于实现页面间的交互,特别是数据传递。在你的场景中,"B页面往A页面传值"是一个典型的使用Delegate进行反向传值的例子。下面将详细讲解iOS中Delegate的概念...
首先,定义一个协议,该协议包含你希望在两个ViewController之间传递的属性或方法。然后,让接收值的ViewController成为发送值的ViewController的代理。在发送值的ViewController中,当需要传递数据时,通过代理协议...
实现六种iOS中常用的传值,包括:block、delegate、Notification通知传值、KVC传值、NSUserDefaults(本地数据持久化)和单例传值。这几种传值写在一个demo中,并附有详细的注释说明。
标题提到的"ios 使用代理双向传值"是指在Objective-C或Swift中利用代理协议(Delegate Protocol)进行数据的双向传递,通常在不同界面之间或者组件之间进行通信时使用。这种设计模式允许一个对象(发送者)通知另一...
在iOS开发中,Delegate是一种非常重要的设计模式,它允许对象之间进行通信,特别是当一个对象(委托者)需要通知另一个对象(委托对象)其状态变化或执行某些操作时。在这个"IOS开发delegate Demo"中,我们将深入...