2013-02-24 45 views
28

我需要从应用程序代理传递一个字符串到我的初始视图控制器, 有人可以列出我做这件事的最好方法,我也尝试使用NS用户默认值进行保存和检索,但我没有正常工作。从应用程序委托传递数据到视图控制器

+0

这不是出于某种原因。原因很明显,应用程序委托的目的是响应应用程序状态的变化。使用它作为数据和常量的倾倒基础是糟糕的形式,并导致依赖于在MVC范例中不是贡献公民的对象。 – Tyten 2015-02-10 21:29:02

回答

28

接口:

@interface MyAppDelegate : NSObject { 
    NSString *myString; 
} 
@property (nonatomic, retain) NSString *myString; 
... 
@end 

,并为App委托.m文件你可以这样写:

@implementation MyAppDelegate 
@synthesize myString; 
    myString = some string; 
@end 

然后,在viewcontroller.m文件,您可以获取:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
someString = appDelegate.myString; //..to read 
appDelegate.myString = some NSString;  //..to write 
+2

这篇文章刚刚救了我的一天。非常感谢朋友。 – Avijit 2014-01-07 11:47:28

+0

你的答案应该包含大写字母:“我的方法是危险和不好的做法,因为它打破封装并创建全局状态。” – 2015-12-17 16:00:05

14

您可以像这样访问您的根视图控制器Ë应用委托:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    MyViewController* mainController = (MyViewController*) self.window.rootViewController; 
    [mainController passData:@"hello"]; 

    return YES; 
} 
17

这对于夫特:

视图控制器

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 

此外,如果有要视图控制器之间传递的对象(例如,我有我想分享的CloudKit数据)将此添加到应用程序代表

/* Function for any view controller to grab the instantiated CloudDataObject */ 
func getCloudData() ->CloudData{ 
    return cloudDataObject 
} 

然后回到视图控制器

var model : CloudData = self.appDelegate.getCloudData() 
相关问题