在另一个视图控制器中更改标签的文本

时间:2013-08-12 18:23:29

标签: objective-c uiviewcontroller uilabel

我有一个名为FirstViewController的视图控制器,另一个名为SecondViewController。我用

呈现第二个视图控制器
 UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"mainController"];
[self presentViewController:controller animated:YES completion:nil];

在SecondViewController的.m中,我想在FirstViewController中更改UILabel的文本。但是,标签的文本未更新。如何在SecondViewController中按下UIButton时更新FirstViewController的标签?

4 个答案:

答案 0 :(得分:6)

您可以使用委托模式

首先创建您的委托协议

@class SecondViewController;

@protocol SecondViewControllerDelegate

-(void) updateLabelWithString:(NSString*)string

@end

@property (weak, nonatomic) id<SecondViewControllerDelegate>delegate;

在与IBAction

相关联的UIButton
[self.delegate updateLabelWithString:yourString];
在FirstViewController.h中

#import "SecondViewController.h"

@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
在FirstViewController.m中

-(void) updateLabelWithString:(NSString*)string {
   label.text = string;
} 

然后在创建控制器实例时,将FirstViewController设置为mainViewController的委托

controller.delegate = self;

答案 1 :(得分:4)

这里有其他答案是好的。我发布了这个,所以我可以肯定你会看到它。我在这里留下了你可能看不到的其他答案的评论。

有几种方法可以实现您的解决方案。

  1. KVO(键值观察)

    KVO是一种“观察”任何对象状态的方法,并在该对象发生变化时得到通知。作为一个新的开发者,KVO很难学习。想想这样。如果你知道x = 1,并且你想知道x是否有变化,你可以设置为“观察”x。如果x发生了变化,就会发生一个事件,并且会通知您的“观察类”发生了变化,以及变更的范围是什么。我有时会监视可变数组的数量,以查看是否已添加或删除了项目。

  2. NSNotification

    NSNotification与KVO类似,但没有任何关于它的自动化。像KVO一样,你设置了一个“观察者”类,并监听一个特定的“事件”。您选择事件发生的时间,然后创建NSNotification并“发布”它。任何正在监听“观察者”的班级都会看到该通知,并在适当时采取行动。

  3. 委托模式

    这是上面的答案。了解委托如何运作非常重要。对于您的确切情况,我认为这不是正确的行动方案,但它会起作用。由于“封装”,您需要委派,这意味着A类不应该知道B类中发生了什么,反之亦然。使用委托可以鼓励课堂之间的独立。

  4. 的Singleton / SharedInstance

    我相信这是处理当前问题的最佳方式。但是,这不是全部/全部。单身人士帮助实施“MVC”(模型,视图,控制器)模式编程。这是封装的一部分。 “模型”存储信息。 “视图”显示信息。 “控制器”将模型连接到视图。在这种情况下,您的第一个和第二个视图都是MVC“V”约定的一部分。 “M”将是你的单身人士班级。 “C”将是您的viewControllers,访问单例并显示值。

  5. 很抱歉没有解释如何做每一个。这四个都是教程。只是希望你以新的理解前进。

    编辑:我想指出我像单个便携式数据库一样使用单例。通常使用辅助方法设置,例如快速查找libraryPath,编码为NSData,以免混淆appDelegate。通常会有一个主数组对象存储多个类中所需的信息。也许数组有一堆NSDictionaries代表在线店面中的项目。我并不是说他开始存储dataModel.classALabelText = @"Hello World";,但这是一个很好的跳跃点

答案 2 :(得分:3)

如果您遵循模型 - 视图 - 控制器范例(或体系结构),则应更改模型中的值(即,在实现模型的对象中)。然后,控制器层应确保在UI中更新所有相关视图。

这样您就不必让视图控制器在它们之间传播更新。

答案 3 :(得分:2)

最常见的方法之一是创建一个 sharedInstance 类,无论您使用何种控制器,都可以存储该值,然后在显示所需的控制器时从中读取该值

一个很好的例子:

Question regarding SharedInstance

这是一个体面的教程:

http://iphonedevsdk.com/forum/iphone-sdk-tutorials/24135-singleton-classes.html

您也可以使用

prepareForSegue:sender:

Stackoverflow上有很多例子。