Ios 将数据从应用程序委托传递到视图控制器

Ios 将数据从应用程序委托传递到视图控制器,ios,objective-c,nsuserdefaults,Ios,Objective C,Nsuserdefaults,我需要将一个字符串从App delegate传递到我的初始视图控制器, 有人能给我列出最好的方法吗?我也试着用NS用户默认值保存和检索,但我没有正常工作 界面: @interface MyAppDelegate : NSObject { NSString *myString; } @property (nonatomic, retain) NSString *myString; ... @end let yourViewController = self.window?.rootView

我需要将一个字符串从App delegate传递到我的初始视图控制器,
有人能给我列出最好的方法吗?我也试着用NS用户默认值保存和检索,但我没有正常工作

界面:

@interface MyAppDelegate : NSObject  {
  NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
...
@end
let yourViewController = self.window?.rootViewController as? YourViewController
yourViewController?.passData(YOUR_DATA) // pass data
let data = yourViewController?.getData() // access data
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.passData(YOUR_DATA) // pass data
let data = appDelegate.getData() // access data
private var data : String? // String? or any type you want
func getData() -> String? {
    return data
}
func passData(_ data : String?) {
    self.data = data
}
在应用程序代理的.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

您可以通过应用程序代理访问根视图控制器,如下所示:

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

    return YES;
}
这是给斯威夫特的:

视图控制器

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var model : CloudData = self.appDelegate.getCloudData()
此外,如果您有一个要在视图控制器之间传递的对象(例如,我有一个要共享的CloudKit数据),请将其添加到应用程序委托中:

    /* Function for any view controller to grab the instantiated CloudDataObject */
func getCloudData() ->CloudData{
    return cloudDataObject
}
然后回到视图控制器

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
var model : CloudData = self.appDelegate.getCloudData()
使用Swift 4.2:

将数据从AppDelegate传递到ViewController:

@interface MyAppDelegate : NSObject  {
  NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
...
@end
let yourViewController = self.window?.rootViewController as? YourViewController
yourViewController?.passData(YOUR_DATA) // pass data
let data = yourViewController?.getData() // access data
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.passData(YOUR_DATA) // pass data
let data = appDelegate.getData() // access data
private var data : String? // String? or any type you want
func getData() -> String? {
    return data
}
func passData(_ data : String?) {
    self.data = data
}
将数据从ViewController传递到AppDelegate:

@interface MyAppDelegate : NSObject  {
  NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
...
@end
let yourViewController = self.window?.rootViewController as? YourViewController
yourViewController?.passData(YOUR_DATA) // pass data
let data = yourViewController?.getData() // access data
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.passData(YOUR_DATA) // pass data
let data = appDelegate.getData() // access data
private var data : String? // String? or any type you want
func getData() -> String? {
    return data
}
func passData(_ data : String?) {
    self.data = data
}
向ViewController或AppDelegate添加以下代码:

@interface MyAppDelegate : NSObject  {
  NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
...
@end
let yourViewController = self.window?.rootViewController as? YourViewController
yourViewController?.passData(YOUR_DATA) // pass data
let data = yourViewController?.getData() // access data
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.passData(YOUR_DATA) // pass data
let data = appDelegate.getData() // access data
private var data : String? // String? or any type you want
func getData() -> String? {
    return data
}
func passData(_ data : String?) {
    self.data = data
}

这篇文章救了我一命。非常感谢你的朋友。你的答案应该包含大写字母:“我的方法是危险的和糟糕的做法,因为它破坏了封装并创建了全局状态。”这不是出于某种原因。原因非常明确,因为应用程序委托的目的是响应应用程序状态的更改。使用它作为数据和常量的转储地是一种糟糕的形式,会导致依赖于一个在MVC范例中不是贡献公民的对象。passData从哪里来?如何申报?