如何从另一个View Controller更改UILabel一个View Controller?

时间:2014-10-01 14:48:30

标签: ios xcode uilabel viewcontroller tabbarcontroller

我对Xcode相对较新,并试图通过搜索找到答案,没有运气。

我的应用有5个视图控制器,V1到V5,它们嵌入在一个标签栏控制器中。每个视图控制器都有一个相同的设置菜单视图控制器。菜单更改视图控制器上的一些标签。我使用委托确保当您离开菜单时,调用菜单的View Controller会使用新设置进行更新。但是,这允许我仅修改视图控制器上调用菜单控制器的标签,而不是其他4个标签。

我在故事板上工作。有没有一种简单的方法可以在V1,V3,V4和V5上设置UILabel(反之亦然),甚至更好,从菜单视图控制器(未嵌入标签栏)中设置V1到V5的标签控制器)?

我已经看到了可以帮助here的东西,但这对我想要的东西来说似乎相当复杂。我需要的标签更改非常简单,并且都是预定义的。每次在选项卡式应用程序中切换选项卡时是否有一个方法被调用?与ViewDidLoad类似?

4 个答案:

答案 0 :(得分:3)

这听起来像是NSNotificationCenter的好时机。您将要让MenuViewController生成一个通知,其中包含应在其他视图控制器中更新的新数据:

// User has updated Menu values
[[NSNotificationCenter defaultCenter] postNotificationName:@"MenuDataDidChangeStuffForLabels" object:self userInfo:@{@"newLabelValue" : labelText}];

在您的V1,V2等中,您可以在viewDidLoad方法中使用此代码添加订阅这些通知:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Subscribe to NSNotifications named "MenuDataDidChangeStuffForLabels"
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLabelText) name:@"MenuDataDidChangeStuffForLabels" object:nil];
}

使用该代码订阅的任何对象都会在MenuViewController发布具有该名称的通知时调用updateLabelText方法。从该方法中,您可以获得新的标签值并将其分配给您的标签。

- (void)updateLabelText:(NSNotification *)notification {
    NSString *newText = notification.userInfo[@"newLabelValue"];
    myLabel.text = newText;
}

答案 1 :(得分:0)

我要做的是将标签栏控制器子类化并将其设置为菜单视图控制器的委托。从那里,您可以在标签发生变化时获得更新,然后与5个标签进行通信并更新标签。

或者,您可以使用NSNotifications让所有5个视图控制器知道设置何时更改。

最后,您可以将菜单设置添加到单例,并让所有视图控制器观察可以更改的各种属性。

  

我需要的标签更改非常简单,并且都是预定义的。每次在选项卡式应用程序中切换选项卡时是否有一个方法被调用?与ViewDidLoad类似?

关于这个问题,您正在寻找的方法是viewWillAppear:viewDidAppear

答案 2 :(得分:0)

如果您的工作流程也很简单,这是一个非常简单的解决方案。此方法直接从您调用Menu ViewController的方式更改来自不同ViewControllers的所有标签。

让我们说你有以下情况:

Storyboard

蓝色ViewController属于FirstViewController类。绿色ViewController属于SecondViewController类。每个标签都由属性firstVCLabelsecondVCLabel引用(在相应的类'头文件中)。这两个ViewControllers都有一个" Modal"在内部触摸时简单地模仿的按钮。

因此,当您在这两个按钮中的任何一个上进行clic时,会显示橙色的ViewController(ModalViewController类)。这个ViewController有两个按钮," Change Label"和"返回",它们与名为changeLabel:back:的IBActions中的内容相关联。

以下是ModalViewController的代码:

#import "ModalViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"

@interface ModalViewController ()

@end

@implementation ModalViewController

// Action linked to the "Change Label" button
- (IBAction)changeLabel:(id)sender {

    // Access the presenting ViewController, which is directly the TabBarController in this particular case
    // The cast is simply to get rid of the warning
    UITabBarController *tabBarController = (UITabBarController*)self.presentingViewController;

    // Go through all the ViewControllers presented by the TabBarController
    for (UIViewController *viewController in tabBarController.viewControllers) {

        // You can handle each ViewController separately by looking at its class

        if ([viewController isKindOfClass:[FirstViewController class]]) {

            // Cast the ViewController to access its properties
            FirstViewController *firstVC = (FirstViewController*)viewController;
            // Update the label
            firstVC.firstVCLabel.text = @"Updated first VC label from Modal";

        } else if ([viewController isKindOfClass:[SecondViewController class]]) {

            SecondViewController *secondVC = (SecondViewController*)viewController;
            secondVC.secondVCLabel.text = @"Updated second VC label from Modal";
        }
    }
}

// Action linked to the "Back" button
- (IBAction)back:(id)sender {

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

为了完整起见,这里有FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *firstVCLabel;

@end

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *secondVCLabel;

@end

这些类的实现中没有相关的代码。

答案 3 :(得分:0)

非常感谢你们,我对你的快速反应印象深刻。在这种特殊情况下,viewWillAppear可以解决这个问题:

- (void)viewWillAppear:(BOOL)animated
{   [self AdaptLabels]; 
    NSLog(@"View will appear.");
}

每次选择新标签时,它都会根据菜单设置的全局变量更新新视图中的标签,就在它们出现之前。非常快速和干净。谢谢你们所有人!