0

说如果我们有AppDelegate.h

@property (strong, nonatomic) NSMutableArray *someList;

.m

@synthesize someList;

然后我想ViewController.m,我们可以做

NSLog(@"%@", [[UIApplication sharedApplication] delegate].someList);

但它实际上编译时出现 Property someListnot found on object错误UIApplicationDelegate?为什么会这样?(实际上,这是将数据传递给 ViewController 的首选方式吗?另一种方式似乎是将其声明为 的属性ViewController,并在方法内部的代码中设置此属性application:didFinishLaunchingWithOptions。)

4

4 回答 4

2

您需要转换[[UIApplication sharedApplication] delegate]为适当的类型,因为此时编译器只是认为它是id<UIApplicationDelegate>. 在您的 中考虑以下内容ViewController.m

- (NSMutableArray *)someList {
    return ((AppDelegate *)[[UIApplication sharedApplication] delegate]).someList;
}

有了它,您可以self.someList在视图控制器中的任何位置访问。请注意,您可能需要#import "AppDelegate.h"ViewController.m.

于 2012-08-22T22:04:43.283 回答
2

someListAppDelegateand not的属性UIApplicationDelegate。所以你必须添加一个演员:

NSLog(@"%@", [(AppDelegate *)[UIApplication sharedApplication].delegate someList]);
于 2012-08-22T22:05:17.227 回答
1

投射它:

NSLog(@"%@", ((AppDelegate *)[[UIApplication sharedApplication] delegate]).someList);
于 2012-08-22T22:04:55.030 回答
0

你需要投射它。但我经常使用它,以至于我在我的类上创建了一个方法。

- (MyApplicationDelegate*) appDelegate{
    return (MyApplicationDelegate*)[UIApplication sharedApplication].delegate;
}

那么您只需要从项目中调用应用程序委托。

- (void) someAction {
    [[self appDelegate].someList addObject:@"new object"];
}

我觉得这是一个更好的方法。

于 2012-08-22T22:20:15.087 回答