我喜欢MVC,但我不是一个绝对的纯粹主义者,为了完成相当平凡的任务而伤害自己,所以你在这里得到的答案是好的和有用的。但是,通过创建一个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"];
// Do something with option1
谢谢你的回答。这与我已经完成的似乎有点不同,但我认为它也可能有用。我尝试这个概念ASAN :) – konradowy 2010-06-10 19:02:30