我怀疑这是一个非常简单的答案,或者我完全走错了路。我需要能够从App Delegate或其他视图控制器在视图控制器中设置变量和访问字段等。
以前我可以通过在'didFinishLaunchingWithOptions'中执行以下操作,从App Delegate到我的第一个视图控制器:
viewController =(ViewController *)self.window.rootViewController;
之后我可以通过正常的[viewController someMethod];来从App Delegate访问视图控制器中的方法。
如果我有多个视图控制器(目前有3个),我如何从其他位置访问其他视图控制器?顺便说一句,我已经找到了一些解释,但所有人都在讨论nib / xibs与代码的结合。我没有它们,我有一个故事板和代码(我是app dev的新手)。
谢谢!
答案 0 :(得分:5)
在appDelegate中,您可以简单地声明将保存对此viewControllers的引用的属性。
例如:
在AppDelegate.h中
@property (nonatomic, strong) UIViewController *vc1;
@property (nonatomic, strong) UIViewController *vc2;
AppDelegate.m中的
@synthesize vc1,vc2;
无论您在何处创建此viewControllers
,都可以访问appDelegate
并设置其属性以保留正确的引用。不要忘记将AppDelegate.h
包含在此文件中。
UIViewController *someVC = [init view controller....];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.vc1 = someVC;
从那时起,您可以将此viewController作为appDelegate的属性访问。
编辑:对于storyBoarding,- (void)viewDidLoad
看起来这样做是安全的。
或者更好的方法(正如理查德所提到的)在- (id)initWithCoder:(NSCoder *)decoder
“从故事板中实例化视图控制器时,iOS会通过调用其initWithCoder:方法来初始化新的视图控制器。”来自documentation
但请注意,如果您要将任何数据从一个视图控制器更改为另一个视图控制器,您可能需要考虑将这些数据保存在单独的代码部分中(model
方法中称为model-view-controller
) 。这是在viewControllers之间“交换”数据最安全的方式。