2010-12-13 41 views

回答

-2

您可以为您的第一个视图控制器存储文本费尔德价值,只是在你的第二个视图控制器创建第一个视图控制器类的引用......然后你就可以访问变量

5

通过创建一个创建全局变量一个ivar可以引用一个特定的类型,比如标签或其他视图控制器,你可以把所有不需要耦合的东西结合在一起。你可以做的是让你的第一个标签视图控制器成为你的第二个标签视图控制器的代表。所以在你的应用代理中做这样的事情。

OptionsViewController *optionsViewController = // ... get this from the tab view 
FirsTabViewController *firstTabViewController = // ... same here 

[optionsViewController setDelegate:firsTabViewController]; 

,这意味着你需要在你的OptionsViewController伊娃:当你想要触发这种改变发生在你的选择浏览器,查看代理人是否可以应对任何事件

@property (assign) id delegate; 

然后,一个你已经命名的选择器。例如:

- (void)someEventHappenedLikeTyping:(id)sender; 
{ 
if ([delegate respondsToSelector:@selector(setOptionsString:)] 
    [delegate performSelector:@selector(setOptionsString:) withObject:[label text]]; 
} 

请注意,您从未指定过任何特定的对象类型。你只需检查委托(是否声明为id)是否可以响应该选择器。如果可以的话,它会按照它所说的去做,否则就会保持沉默。

对于这个工作,你需要在你的FirstTabViewController的optionsString伊娃,所以它会在头被声明为:

@property (copy) NSString *optionsString; 

,然后在.M @synthesize它。这会导致-setOptionsString成为将在-someEventHappenedLikeTyping方法中调用的有效选择器。无论如何,现在,如果你需要改变哪个视图控制器引用哪个,你不必进入头部并且改变引用的ivar的类型。您只需在作为选项视图控制器代表的视图控制器中实现选择器(顺便提一句,这称为非正式协议)。

只是一些思考的食物。希望有所帮助。在我添加的代码中可以做进一步的分离,但是对于这样一个简单的任务来说,这又可能是过度的。让我知道你是否需要澄清或者想通过进一步解耦来理解我的意思。

此致敬礼

p.s.有时需要在两个标签栏视图控制器之间共享数据,意味着您有设计缺陷。如果你想要存储的偏好从你的选择来看,你应该叫

[[NSUserDefaults standardUserDefaults] setObject:[label text] forKey:@"option1"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

然后你可以从后面NSUserDefaults的使用您的主选项卡拉;

NSString *option1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"option1"]; 

//使用选项1东西

参考通过How to access data from one view to another view?

相关问题