2010-06-09 80 views
1

我有一个UITabBarController有两个标签:如何从一个视图访问数据到另一个视图?

  1. UINavigationController
  2. OptionsViewController : UIViewController

我怎样才能达到OptionsViewController设置数据(即UILabel.text),在新增加的模式查看其已从UINavigationController调用?

EDIT1:

方案:启动应用程序后,我选择所谓的“选项”里我填了一个文本框的第二个标签栏。标签设置为textField。接下来,我选择第一个标签栏,名为“Main”,我有一个按钮。我点击按钮,出现新的模态视图。在这种新模式的看法,我想从文本框

回答

2

我喜欢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 
+0

谢谢你的回答。这与我已经完成的似乎有点不同,但我认为它也可能有用。我尝试这个概念ASAN :) – konradowy 2010-06-10 19:02:30

1

显示值在你OptionsViewController,创建一个属性:

@property (nonatomic, retain) UILabel *mylabel; 

然后创建OptionsViewController后,却显示它之前,设置mylabel属性。 (或许你只是想文本,所以你可以使用一个NSString*属性。)

编辑:

所以,你可能想要做这样的事情:

OptionsViewController *vc = [[OptionsViewController alloc] init]; 
vc.mylabel = mySomethingLabel; 
[self presentModalViewController:vc animated:YES]; 

所以创建后该对象,您设置属性,然后您显示视图控制器。

+0

是啊,我有@property在OptionViewController。问题是如何从不同的控制器获得该值 – konradowy 2010-06-09 19:14:51

+0

请参阅我在此之前的解决方案:http://stackoverflow.com/questions/2914543/access-uitableview-from-view-get-a-value-and-come-back- iphone/2915659#2915659 – iwasrobbed 2010-06-09 19:42:19

+0

@Rob:IMO全局应该用作最后的手段。 – Emil 2010-06-10 08:28:26

0

我通常在指向其他控制器的每个视图控制器中设置IBOutlets。 所以,如果我有查看控制器A和B.A有一个IBOutlet B和B到A.然后,每当我想访问B中的任何东西我只是在B上使用点运算符。

在您的示例UINavigationController将#include "OptionsViewController.h",并有一个ivar IBOutlet OptionsViewController * ovc(它在IB中设置),然后从您的选项视图控制器中的任何实例变量可以从导航控制器引用为ovc.UILabel.text。这个过程可以颠倒过来,从您的选项视图控制器中访问导航控制器中的值。

实例导航控制器(.H):

#include "OptionsViewController.h" 
@interface UINavigationController // (whatever the name of this class is) 
{ 
OptionsViewController * ovc; 
} 
@property (nonatomic, retain) IBOutlet OptionsViewController * ovc; 
@end 

例OptionsViewController.h:

@interface OptionsViewController 
{ 
UILabel * label; 
} 
@property (nonatomic, retain) IBOutlet UILabel * label; 
@end 

然后从UINavigationController的(.M),你可以只写ovc.label.text访问文本。

+0

而不是@implementation应该是@interface。无论如何不适合我... – konradowy 2010-06-10 07:52:26

+0

我看不出有任何理由使用Interface Builder。 – Emil 2010-06-10 08:26:29

0

我有一个简单的方法来访问视图之间的数据。咱们试试吧。你有两个观点命名厂景和视图2,你可以定义view2.h视图* VC1属性,设置VC1点VIEW1,当弹出view2的,就像这样:

view1.m

 
//here pop out view1 code 
    View2 *view2 = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]]; 
    [self.navigationController pushViewController:view2 animated:YES]; 
    view2.vc1 = self; //transfer view1 instance to view2,use vc1 you may handle view1 in view2 directly 
     [view2 release]; 

view2.h

 
    #import "view1.h" 
    @property (nonatomic, retain) IBOutlet View1 *vc1; //here you could name it as view1 as well :) 

视图2。米

 
    vc1.lblTable.text = @"ok"; //you'll see "ok" in view1 
    [self.navigationController popViewControllerAnimated:YES]; //navigate to view1 

//不要忘记释放VC1

相关问题