3

我有一个名为 FirstViewController 的视图控制器,还有一个名为 SecondViewController 的视图控制器。我提出了第二个视图控制器

 UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"mainController"];
[self presentViewController:controller animated:YES completion:nil];

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

4

4 回答 4

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;
于 2013-08-12T18:59:08.383 回答
4

这里还有其他很好的答案。我把这个贴出来,所以我可以确定你会看到它。我在这里对您可能看不到的其他答案发表了评论。

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

  1. KVO(键值观察)

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

  2. NS通知

    NSNotification 类似于 KVO,除了它没有什么自动的。与 KVO 一样,您设置了一个“观察者”类,并监听特定的“事件”发生。您选择事件发生的时间,然后创建一个 NSNotification 并“发布”它。任何作为“观察者”侦听的类都将看到该通知并在适当的情况下采取行动。

  3. 委托模式

    这是上面的答案。了解委派的工作原理很重要。对于您的确切情况,我认为这不是正确的做法,但它会起作用。由于“封装”,您需要委托,这意味着 A 类不应该知道 B 类中发生了什么,反之亦然。使用委托可以鼓励类之间的独立性。

  4. 单例/共享实例

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

很抱歉没有详细说明如何做每一个。这四个本身就是教程。只希望你带着新的理解前进。

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

于 2013-08-12T19:22:10.203 回答
3

如果您遵循模型-视图-控制器范式(或架构),那么您应该更改模型中的值(即,在实现您的模型的对象中)。然后,控制器层应确保所有相关视图都在 UI 中更新。

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

于 2013-08-12T19:01:49.223 回答
2

最常见的方法之一是创建一个sharedInstance类,无论您在哪个控制器中,您都可以在其中存储值,然后在显示您想要的控制器时从中读取。

一个很好的例子:

关于 SharedInstance 的问题

这里有一个不错的教程:

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

你也可以使用

prepareForSegue:sender:

Stackoverflow 上有很多这样的例子。

于 2013-08-12T18:48:48.367 回答