【问题标题】:Updating uilabel in view controller underneath another在另一个下面的视图控制器中更新 uilabel
【发布时间】:2013-08-13 04:25:19
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    当您从 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 委托,并创建一个委托方法来更新标签。 FirstViewController 应该实现这个方法。

    【讨论】:

    • 如果我在FirstViewController的接口中定义了firstController呢?我还要创建 FirstViewController 的新实例吗?
    • @user1626438 我不确定我是否理解您的问题
    • 在FirstViewController的界面中,如果我定义:FirstViewController *firstController;
    • @user1626438 哦,我明白了,但如果我是你,我不会那样做。通知的事情很简单。这是最好、最简单的方法。
    【解决方案2】:

    如果您想在第一个屏幕上更新标签而不是其他任何内容,那么请使用通知。最好是你写委托。因为您只想更新标签文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多