如何在两个ViewController之间传递数据

 我来答
day忘不掉的痛
2015-02-07 · 知道合伙人数码行家
day忘不掉的痛
知道合伙人数码行家
采纳数:62646 获赞数:223941
本人担任公司网络部总经理多年,有充足的网络经验、互联网相关知识和资讯。

向TA提问 私信TA
展开全部
把窗体的某部信息(控件或属性)设置为public static即可。。。

在窗体里的InitializeComponent();初始化方法里。。。你可以找到所有已添加的控件的创建信息。其它在最底部有控件的声明信息。。。你只要把private 改成public static即可。。。

不过还有一个问题。改成static静态成员的话。也相应的要把当前窗体内所有关于该对象的调用的“this.”都删除掉。因为static不属于任何对象。他是公用的对象。

而且,调用该对象的时候,可以用他所在的:类名.static对象名.。。。在该static声明的类中,可以不用类名。static对象名,直接static对象名即可,对象,方法,属性,都可以这样用,这是static的特点。

不过调用static对象的对象也得是static才可以。。。相关更具体对static的了解,你可以到网上查看。

如果你现在在Form1里的某个TextBox控件值改变时,相应的Form2的某个TextBox控件值也相应变化,可以这样写。

Form1:
要把该TextBox1的声明改成:
public static TextBox TextBox1;
指导到TextBox的TextChanged事件。
添加该事件:
private void TextBox1_TextChanged(object sender,Evetn..... e)
{
Form2.TextBox1.Text=Form2.TextBox1.Text;
}

Form2:
要把该TextBox1的声明改成:
public static TextBox TextBox1;
再用以上的代码即可。
du若冰
2015-02-07 · TA获得超过1885个赞
知道大有可为答主
回答量:1403
采纳率:100%
帮助的人:857万
展开全部
参考:

http://blog.sina.com.cn/s/blog_4431c7610100vgds.html

http://blog.163.com/zhe8stianshi@126/blog/static/17176291920117233111605/

一般方法
1)采用代理模式 子viewcontroller设计 代理协议,定义协议接口,父viewcontroller 实现协议接口,实现子viewcontroller 退出时将相关数据更新到父视图。
2)采用ios的消息机制 父viewcontroller注册消息 子viewcontroller 发送消息,触发父viewcontroller的消息处理。
3)采用database做为数据中间的存储媒介,子viewcontroller将状态数据存入DB,父viewcontroller从DB获取数据更新view。
4)采用ios的NSDefault 存储
5)通过AppDelegate 中定义全局变量实现中间数据的存储。

UIViewController和UIViewController之间的交互

UIViewController之间,是否需要交互,怎样交互?这个问题困扰我一段时间了,凭空的去想象,其实很难想明白,尤其是在短时间内。最好的办法,还是在持久的编码/读代码的过程中,根据不同的使用场合及使用需求,来学习体会。

顺便还想说一句,图形界面编程,最基本的编程思路和方法都是类似的,如果你熟悉不止一种图形SDK,你就会发现其实它们都是触类旁通的。最近我就游走于cocoa和qml之间,再加上之前qtwidget、gtk、clutter的编程经验,我发现使用这些不同的sdk,对于我个人的编程技能的增长,很好的起到了互补的作用。

假设使用UINavigationController进行导航,有两层界面结构,都使用自定义UIViewController的子类,分别为level1ViewController和level2ViewController。

1 单向交互。

第一级level1ViewController负责创建第二级level2ViewController,并且设置level2ViewController相关的属性,然后pushlevel2ViewController。伪代码如下:

view plainprint?
[[level2ViewController alloc] init];

[level2ViewController setProp_1];
[level2ViewController setProp_2];
[level2ViewController setProp_3];

[level1ViewController. navigationController
pushViewController:level2ViewController];

[level2ViewController release];

这种情况下,从level1ViewController的角度来看,它只需要初始化level2ViewController,设置它的一些属性,调用push,然后就什么都不用管了。从level2ViewController的角度来看,当它被push后,在它的生命期内,都不会影响level1ViewController,不需要调用level1ViewController的函数,也没有事件需要通知level1ViewController。

这是最简单的使用情形,也是最理想化的。在项目设计阶段,应该尽量把代码设计成这种结构(仅仅是尽量,并不是必须。而且,也并不是所有的使用场景都都可以设计成这样的结构,毕竟这个太理想化了)。

2 双向交互,共享数据

level1ViewController和level2ViewController使用共同的一个数据shareData(一定要理解这里“共同”的含义------两个controller共享同一个数据,并且都有可能进行读写操作,尤其是写操作。如果level2ViewController只对数据进行读操作,那其实就跟前面1中的情形是一致的)。第一级level1ViewController负责创建第二级level2ViewController,并且设置level2ViewController相关的属性,同时还要把shareData传递给level2ViewController,然后pushlevel2ViewController。伪代码如下:

view plainprint?
<span style="font-size:16px;"></span><pre name="code" class="plain">[[shareData alloc] init];

[[level2ViewController alloc] init];

[level2ViewController setProp_1];
[level2ViewController setProp_2];
[level2ViewController setData: shareData];

[level1ViewController. navigationController
pushViewController:level2ViewController];

[level2ViewController release];

和前一种情形的区别是,在level2ViewController的生命期内,它可能会对shareData进行写操作,当发生这种写操作的时候,需要让level1ViewController知道这种变化,并且作出对应的处理。

这个时候,比较容易想到的一种解决办法是使用Delegate,当level2ViewController写操作shareData时,通过Delegate机制通知level1ViewController,给予level1ViewController一个机会作出正确的响应。

这种办法虽然可行,但并不是首选,在面向对象编程中,经常会提到“解耦”,这里我们就要想办法让这两个controller不要联系的这么紧密。那么怎么办呢?

就是使用MVC模式(UIViewController本身就是MVC中的C)。这个时候,shareData就不应该再是一个普通的数据,而应该封装成model,当model中的数据发生了改变的时候,会发出通知告诉C(和/或V)。这样的话,两个controller之间就比较松散了。引入dataModel后,伪代码如下:

view plainprint?
<span style="font-size:16px;"></span><pre name="code" class="plain">[[shareData alloc] init];
[dataModel alloc] initWithData: shareData];

[[level2ViewController alloc] init];

[level2ViewController setProp_1];
[level2ViewController setProp_2];
[level2ViewController setModel: dataModel];

[level1ViewController. navigationController
pushViewController:level2ViewController];

[level2ViewController release];

当level2ViewController修改shareData后,不需要负责通知level1ViewController。shareData会负责通知它的controller。

3 双向交互,逆向消息传递

这时,基本操作都还是前面描述的1或2中的情形,区别点在于,在level2ViewController的生命期内,发生了某个事件,需要让level1ViewController知道这个事件,并且作出对应的处理。

这个时候,就只能用Delegate了。当level2ViewController发生某个事件时,通过Delegate机制通知level1ViewController,给与level1ViewController一个机会作出正确的响应。

但是!一定要谨慎使用这种方案。如果发现代码中需要用到这种结构,首先应该重新审视项目的架构,看能不能用前面两种方案来处理,可能需要做一定的代码重构。当前面的方案实在是无能为力的时候,才考虑使用此方案。而且,尽量让这种逆向的消息传递更简单,消息事件不要太多。

4 双向交互,大量逆向消息传递

这种情形和前面的3是一样的,但是level2ViewController和level1ViewController之间的消息传递更复杂。

这个时候,同样,要审视代码的结构是否合理。而且很大的可能性是设计不合理,应该考虑把level2ViewController中管理的UIView迁移到level1ViewController中,把controller之间的交互,变成controller内部的view之间的交互,让level1ViewController的内部聚合的更紧密一些,对外部,level1ViewController则表现的更松散。例如,UIAlertView或UIActionSheet,都是UIView的子类。(此处并不绝对,在有些sdk中,类似于UIAlertView或UIActionSheet的组件,它的使用情形,是符合前面3中的描述的,因为这两种组件的行为模式,是有规律性的,可以很方便的复用,举个例子,桌面编程环境中,文件选择器这种组件,通常就是一个顶层window)

最后还要补充说明一些内容。

Cocoa是比较严格的执行了MVC设计模式,其中的UIViewController,可以看成是某种使用场合下,一些内在联系很紧密、并且协同工作的UIView的一个顶层管理容器。

在其他的sdk中,不一定有严格的controller,很有可能只有M和V(C的功能在V内实现),甚至只有V(简单的使用场景,就可以不区分M和C,全在V内管理)。这个时候,就有顶层View的概念(有很多种叫法,比如page、window,或者直接使用abstractWidget),这种逻辑概念上的顶层View,在设计的时候,同样需要考虑它们之间的交互,前面描述的这些情形,同样可以套用。

在用户体验的角度来看,controll或者顶层view,通常被成为“场景”,场景之间是否需要交互,前面的描述,也有一定的参考价值。

但是场景的概念并非总和controll或顶层view严格对应,“场景”是更抽象化的内容,更符合人类的直观感觉,而controll/顶层view是更工程化的概念,更精确。在用户体验设计中,有些不同的场景,在逻辑上其实可以属于同一个controll

iphone 使用委托(delegate)在不同的窗口之间传递数据

在IOS里两个UIView窗口之间传递参数方法有很多,比如

1.使用SharedApplication,定义一个变量来传递.

2.使用文件,或者NSUserdefault来传递

3.通过一个单例的class来传递

4.通过Delegate来传递。

前面3种方法,暂且不说,这次主要学习如何使用通过Delegate的方法来在不同的UIView里传递数据 。

比如: 在窗口1中打开窗口2,然后在窗口2中填入一个数字,这个数字又回传给窗口1。

窗口1

窗口2

窗口2的结果传递给窗口1

1.首先定义个一委托UIViewPassValueDelegate用来传递值

@protocol UIViewPassValueDelegate

- (void)passValue:(NSString *)value;

@end

这个protocol 就是用来传递值

2.在窗口1的头文件里,声明delegate

#import <UIKit/UIKit.h>
#import "UIViewPassValueDelegate.h"
@interface DelegateSampleViewController : UIViewController <UIViewPassValueDelegate>
{
UITextField *_value;
}
@property(nonatomic, retain) IBOutlet UITextField *value;

- (IBAction)buttonClick:(id)sender;

@end
并实现这个委托

- (void)passValue:(NSString *)value
{
self.value.text = value;
NSLog(@"the get value is %@", value);
}

button的Click方法,打开窗口2,并将窗口2的delegate实现方法指向窗口1。

- (IBAction)buttonClick:(id)sender
{
ValueInputView *valueView = [[ValueInputView alloc] initWithNibName:@"ValueInputView" bundle:[NSBundle mainBundle]];
valueView.delegate = self; // 把两个VC关联起来!
[self setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentModalViewController:valueView animated:YES];
}

第二个窗口的实现

.h 头文件

#import <UIKit/UIKit.h>
#import "UIViewPassValueDelegate.h"

@interface ValueInputView : UIViewController {

NSObject<UIViewPassValueDelegate> * delegate;
UITextField *_value;
}

@property(nonatomic, retain)IBOutlet UITextField *value;
@property(nonatomic, retain) NSObject<UIViewPassValueDelegate> * delegate;

- (IBAction)buttonClick:(id)sender;

@end

.m实现文件

#import "ValueInputView.h"

@implementation ValueInputView

@synthesize delegate;
@synthesize value = _value;
- (void)dealloc {
[self.value release];
[super dealloc];
}

- (IBAction)buttonClick:(id)sender
{
[delegate passValue:self.value.text]; // 具体的实现在第一个VC里。
NSLog(@"self.value.text is%@", self.value.text);
[self dismissModalViewControllerAnimated:YES];

}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code.
}
*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式