在另一个下方的视图控制器中更新uilabel

时间:2013-08-13 04:25:20

标签: ios objective-c cocoa-touch uiviewcontroller uilabel

我有两个视图控制器,FirstViewController和FourthViewController。 FirstViewController是我的初始视图控制器。我用

呈现FourthViewController
UIViewController *fourthController = [self.storyboard instantiateViewControllerWithID:@"Fourth"];
[self presentViewController:fourthController animated:YES completion:nil];

然后,在FourthViewController的.m中,我想在FirstViewController中更改UILabel的文本。所以我用

UIViewController *firstController = [self.storyboard instantiateViewControllerWithID:@"First"];
firstController.mainLab.text = [NSMutableString stringWithFormat:@"New Text"];

然而,在我使用

之后
[self dismissViewControllerAnimated:YES completion:nil];

我发现我的mainLab文本没有更新。有谁知道为什么?

2 个答案:

答案 0 :(得分:3)

当您从FourthViewController.m调用此行时,实际上是在创建FirstViewController的新实例,而不是使用已创建的实例。

UIViewController *firstController = [self.storyboard 
                             instantiateViewControllerWithID:@"First"];

你可以通过两种方式解决这个问题。

1)使用通知

当需要更改标签文本时,

从FourthViewController发布通知。

[[NSNotificationCenter defaultCenter] postNotificationName:@"updateLabel" 
        object:self];

在FirstViewController viewDidLoad方法中,创建一个等待此通知被触发的观察者。

[[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(updateLabelCalled:) 
        name:@"updateLabel"
        object:nil];

实施updateLabelCalled:并更新标签。

- (void) updateLabelCalled:(NSNotification *) notification
{
    if ([[notification name] isEqualToString:@"updateLabel"]){
        //write code to update label
    }

}

2)实施委托

已经在stackoverflow中解释了here。基本思想是创建FourthViewController委托,并为updateLabel创建委托方法。 FirstViewController应该实现这个方法。

答案 1 :(得分:0)

如果您想在第一个屏幕上更新标签而没有其他内容,请转到通知。你最好写代表。因为您只想更新标签文本。