2

我有两个视图控制器,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 的文字没有更新。有谁知道为什么?

4

2 回答 2

3

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

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

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

1) 使用通知

当需要更改标签文本时,从 FourthViewController 发布通知。

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

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

[[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 中进行了解释。基本思想是创建一个FourthViewController 委托,并创建一个委托方法来更新标签。FirstViewController 应该实现这个方法。

于 2013-08-13T04:41:30.900 回答
0

如果您想更新第一个屏幕上的标签而不是其他任何东西,那么就去通知。最好是你写委托。因为您只想更新标签文本。

于 2013-08-13T05:18:49.013 回答