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

32

我需要将一个字符串从应用程序委托传递给我的初始视图控制器,有人能告诉我最好的方法吗?我尝试使用NS用户默认设置保存和检索,但它没有正常工作。


这不是没有原因的。原因很明显,即应用程序委托的目的是响应应用程序状态的变化。将其用作数据和常量的倾倒场所是一种不良形式,并且会导致对并未在MVC范例中发挥贡献的对象产生依赖。 - Tyten
4个回答

30

接口:

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

在AppDelegate的.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
1
我的方��是危险的,也是一种不良实践,因为它破坏了封装性并创建了全局状态。 - Tomasz Bąk

20

这是Swift的代码:

视图控制器

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

此外,如果您有一个想要在视图控制器之间传递的对象(例如,我有一些CloudKit数据想要分享),请将其添加到App Delegate中:

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

然后回到视图控制器

var model : CloudData = self.appDelegate.getCloudData()

14
您可以通过以下方式从应用程序委托访问根视图控制器:

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

    return YES;
}

传递数据从哪里来?它是如何声明的? - Daniele Tentoni

3

使用 Swift 4.2:

从 AppDelegate 传递数据到 ViewController:

let yourViewController = self.window?.rootViewController as? YourViewController
yourViewController?.passData(YOUR_DATA) // pass data
let data = yourViewController?.getData() // access data

将数据从ViewController传递到AppDelegate:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.passData(YOUR_DATA) // pass data
let data = appDelegate.getData() // access data

请将以下代码添加到您的ViewController或AppDelegate中:

private var data : String? // String? or any type you want
func getData() -> String? {
    return data
}
func passData(_ data : String?) {
    self.data = data
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接