我有一个名为FirstViewController的视图控制器,另一个名为SecondViewController。我用
呈现第二个视图控制器 UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"mainController"];
[self presentViewController:controller animated:YES completion:nil];
在SecondViewController的.m中,我想在FirstViewController中更改UILabel的文本。但是,标签的文本未更新。如何在SecondViewController中按下UIButton时更新FirstViewController的标签?
答案 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)
这里有其他答案是好的。我发布了这个,所以我可以肯定你会看到它。我在这里留下了你可能看不到的其他答案的评论。
有几种方法可以实现您的解决方案。
KVO(键值观察)
KVO是一种“观察”任何对象状态的方法,并在该对象发生变化时得到通知。作为一个新的开发者,KVO很难学习。想想这样。如果你知道x = 1,并且你想知道x是否有变化,你可以设置为“观察”x。如果x发生了变化,就会发生一个事件,并且会通知您的“观察类”发生了变化,以及变更的范围是什么。我有时会监视可变数组的数量,以查看是否已添加或删除了项目。
NSNotification
NSNotification与KVO类似,但没有任何关于它的自动化。像KVO一样,你设置了一个“观察者”类,并监听一个特定的“事件”。您选择事件发生的时间,然后创建NSNotification并“发布”它。任何正在监听“观察者”的班级都会看到该通知,并在适当时采取行动。
委托模式
这是上面的答案。了解委托如何运作非常重要。对于您的确切情况,我认为这不是正确的行动方案,但它会起作用。由于“封装”,您需要委派,这意味着A类不应该知道B类中发生了什么,反之亦然。使用委托可以鼓励课堂之间的独立。
的Singleton / SharedInstance
我相信这是处理当前问题的最佳方式。但是,这不是全部/全部。单身人士帮助实施“MVC”(模型,视图,控制器)模式编程。这是封装的一部分。 “模型”存储信息。 “视图”显示信息。 “控制器”将模型连接到视图。在这种情况下,您的第一个和第二个视图都是MVC“V”约定的一部分。 “M”将是你的单身人士班级。 “C”将是您的viewControllers,访问单例并显示值。
很抱歉没有解释如何做每一个。这四个都是教程。只是希望你以新的理解前进。
编辑:我想指出我像单个便携式数据库一样使用单例。通常使用辅助方法设置,例如快速查找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上有很多例子。