将一个视图文本字段值设置为另一个视图标签

时间:2010-12-13 11:02:47

标签: objective-c

我在第一个视图中有textfield和Button。当我单击Button时,它导航第二个视图。我有一个标签。 我的问题是我想将文本字段值设置为标签文本吗?

Plz帮助我!

2 个答案:

答案 0 :(得分:5)

通过创建一个ivar来引用特定类型(如标签或其他视图控制器),您可以将不需要耦合的东西耦合在一起。你可以做的是让你的第一个标签视图控制器成为你的第二个标签视图控制器的委托。所以在你的app delegate中做这样的事情。

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

[optionsViewController setDelegate:firsTabViewController];

这意味着您需要在OptionsViewController中使用ivar:

@property (assign) id delegate;

然后,当您想要触发更改的任何事件发生在选项视图控制器中时,请查看该委托是否可以响应您已命名的选择器。例如:

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

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

为了使其正常工作,您需要在FirstTabViewController中为optionsString使用ivar,因此它将在标头中声明为:

@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"];

//使用option1执行某些操作

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

答案 1 :(得分:-2)

您可以为第一个视图控制器创建一个全局变量来存储文本字段值,并在第二个视图控制器中创建第一个viewcontroller类的引用...然后您可以访问变量