尝试在不同的视图控制器上使用UITextField的内容更新UILabel

时间:2011-07-14 02:41:33

标签: iphone uiviewcontroller uitextfield uilabel

我有两个视图控制器,一个是MainViewController,另一个是SetupViewController。我希望MainViewController上的UILabel在SetupViewController中按下按钮时将文本设置为来自SetupViewController的UITextField的内容。

在SetupViewController中,我在IBAction中有这个:

- (IBAction)donePressed:(id)sender {  
   MainViewController *mvc = [[MainViewController alloc] init]; 
  [mvc.testLabelOnMVC setText:testTextFieldOnSVC.text];
  [release mvc];
}

testLabelOnMVC(和testTextFieldOnSCV,各自的条款)是

@property (nonatomic, retain) UILabel *testLabelOnMVC;

并且也是合成的。

每次尝试,都不起作用。什么都没发生,没有任何改变。我没有错误或警告。任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:1)

在引用MainViewController的视图属性(强制viewDidLoad执行)之前,MainViewController的视图不存在。在尝试修改MainViewController中的任何UI对象之前,必须引用该视图(或以其他方式强制构建视图)。

答案 1 :(得分:0)

当您按下按钮时,您正在分配新的MainViewController,然后您在此新控制器上设置标签的文本,而不是在您的应用正在显示的MainViewController上。

要解决此问题,请创建指向原始MainViewController的IBOutlet或iVar,并在其上设置文本。

答案 2 :(得分:0)

最简单的方法是在主视图控制器中创建一个@property并在其中写入文本。然后在第二个MVC的viewDidLoad中读取它。

答案 3 :(得分:0)

MainViewController应该担心的唯一视图是它拥有的视图;它不应该尝试访问由SetupViewController管理的视图层次结构。同样,SetupViewController不应直接修改MainViewController视图中的视图。

正确的做法是让两个控制器直接或通过数据模型相互通信。例如,假设您的MainViewController实例化SetupViewController。如果是这种情况,mvc将自己设置为svc的委托是很自然的,这样svc就会向-setupController:didUpdateTestStringTo:发送消息testLabel。然后,MainViewController对该方法的实现可以在某处保存新的测试字符串并更新它的{{1}}字段。

另一个例子:MainViewController实例化SetupViewController。 SetupViewController包含一个字段,用户可以在该字段中输入测试字符串的新值。在退出之前,SetupViewController将该字段的内容写入NSUserDefaults或其他一些常见数据存储。当控件返回MainViewController时,该对象将读取共享数据并根据需要自行更新,包括为testLabel设置新值。

同一主题还有其他变体,但这里的共同点是视图控制器都不能直接访问它不拥有的视图。

答案 4 :(得分:0)

如果视图已加载,您可以更改标签的文本。如果您使用导航控制器,而不是初始化viewcontroller,请从视图堆栈中检索它。 我不知道你的viewController是否已经加载。