是否可以从 AppDelegate 获取 NSArray?

Posted

技术标签:

【中文标题】是否可以从 AppDelegate 获取 NSArray?【英文标题】:Is it possible to get a NSArray from AppDelegate? 【发布时间】:2016-07-14 07:08:05 【问题描述】:

是否可以从我的 AppDelegate 获取 NSArray?我需要将一个数组发送到其他类。该数组是在我的 AppDelegate 中生成的。谢谢!

【问题讨论】:

是的,有可能。你知道什么是财产吗?你用过[UIApplicaton sharedApplication].delegate吗? 是的。它是可能的 没有还没用过 那怎么办? @HariKrishnan.P 你能检查我的答案吗 【参考方案1】:

首先你应该allocinit 在 AppDelegate.h 文件中

@property(nonatomic,retain)NSArray *books; 

在 AppDelegate.m 文件中你的数组,然后你可以在其中添加对象。

_books = [[NSArray alloc]initWithObjects:@"test",@"test", nil];

您应该像这样在BooksDetailViewController 中创建 AppDelegate 实例,

在.h文件中

AppDelegate *appDelegate;

在.m文件中

appDelegate  = (AppDelegate*)[UIApplication sharedApplication].delegate;

现在你可以像这样访问你的数组了,

NSLog(@"Test Log :%@",appDelegate.books);

输出:

2016-07-14 13:04:08.211 Gridz[2490:39240] Test Log :(
test,
test
)

【讨论】:

假设我的 AppDelegate 中有一个 NSArray *books。为什么我无法在 appDelegate.books 中访问它?我遗漏了一些东西,比如将书籍公之于众之类的? 你有没有在appdelegate文件中设置属性【参考方案2】:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

现在您可以使用任何属性或方法,例如:

[appDelegate myProperty][appDelegate myMethod]

希望对你有帮助

【讨论】:

假设我的 AppDelegate 中有一个 NSArray *books。为什么我无法在 [appDelegate 图书] 中访问它我错过了一些东西,比如将图书设置在公共场所之类的? 确保您的数组应在 AppDelegate.h 文件中声明为属性,以便在类外访问。【参考方案3】:

可以从 AppDelegate 获取 NSArray 到其他类。

AppDelegate.h

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate> 


@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong) ViewController *viewController; //For Xib
@property (nonatomic, strong) NSArray *arrayObjects;
@end

AppDelegate.m

#import "AppDelegate.h"
#import "ViewController.h"
@implementation AppDelegate
@synthesize arrayObjects;

由于我使用的是Xib,所以我在下面的方法中设置了根视图控制器。如果你使用stroy board,只添加NSArray对象就足够了。不需要设置根视图控制器。

//For XIB
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

   arrayObjects = [[NSArray alloc]initWithObjects:@"Steve",@"jobs",@"Tim",@"Cook",nil];
   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   // Override point for customization after application launch.
   self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
   UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
   self.window.rootViewController = navController;
   [navController setNavigationBarHidden:YES];
   [self.window makeKeyAndVisible];
   return YES;

//For Storyboard
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

   arrayObjects = [[NSArray alloc]initWithObjects:@"Steve",@"jobs",@"Tim",@"Cook",nil];
   return YES;

然后在 ViewController.m 中

也可以在 ViewController.m 中导入 AppDelegate

#import "ViewController.h"
#import "AppDelegate.h"

@interface ViewController ()

@end

@implementation ViewController

现在在 viewDidLoad 方法中

- (void)viewDidLoad

   [super viewDidLoad];
   // Do any additional setup after loading the view, typically from a nib.
    AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    NSLog(@"The app delegate NSArray Objects are - %@",delegate.arrayObjects);

NSLog 结果是

The app delegate NSArray Objects are - (
Steve,
jobs,
Tim,
Cook
)

【讨论】:

以上是关于是否可以从 AppDelegate 获取 NSArray?的主要内容,如果未能解决你的问题,请参考以下文章

从 appDelegate 检索核心数据模型版本

从 AppDelegate 中的 ViewController 获取参数。

如何在 appdelegate 中获取传递的通知详细信息

Swift:从 AppDelegate 中的 UNTextInputNotificationAction 获取内容

如何从 AppDelegate 上的 TabBarController 获取 ViewController?

来自 AppDelegate 的共享 ADBannerView - 如何从代表处获取广告