设置 App Delegate 以管理数据

Posted

技术标签:

【中文标题】设置 App Delegate 以管理数据【英文标题】:Setting up the App Delegate to Manage Data 【发布时间】:2012-11-25 07:44:39 【问题描述】:

我正在开发一个带有拆分视图控制器的应用程序,并希望将主数据类存储在 App Delegate 中,以便我可以从多个视图(MasterView、DetailView 和多个 PopUps)访问它。

我有点菜鸟,不知道为什么会出现错误:

AppDelegate.m:31:26:在“MasterViewController”类型的对象上找不到属性“dataController”

以下是相关代码 - 非常感谢任何帮助。谢谢。

AppDelegate.h

#import <UIKit/UIKit.h>

@class EventClassDataController;
@class MasterViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

AppDelegate.m

#import <UIKit/UIKit.h>

@class EventClassDataController;
@class MasterViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

MasterViewController.h

#import <UIKit/UIKit.h>

@class DetailViewController;
@class EventClassDataController;

@interface MasterViewController : UITableViewController

@property (strong, nonatomic) EventClassDataController *dataController;
@property (strong, nonatomic) DetailViewController *detailViewController;

@end

MasterViewController.m

#import "MasterViewController.h"
#import "DetailViewController.h"
#import "EventClassDataController.h"
#import "EventClass.h"

@interface MasterViewController ()

@end

@implementation MasterViewController

@synthesize detailViewController, dataController;

- (void)awakeFromNib

    self.clearsSelectionOnViewWillAppear = NO;
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);
    [super awakeFromNib];

    // Initialize event data
    self.dataController = [[EventClassDataController alloc] init];

EventClassDataController.h

#import <Foundation/Foundation.h>

@class EventClass;

@interface EventClassDataController : NSObject

@property (nonatomic, copy) NSMutableArray *masterEventList;

-(NSUInteger)countOfList;
-(EventClass *)objectInListAtIndex:(NSUInteger)theIndex;
-(void)addNewEvent:(EventClass *)event;
-(void)removeEvent:(EventClass *)event;

@end

【问题讨论】:

您显示 AppDelegate.h 两次。 粘贴importAppDelegate.m:31的代码。 您的 appDelegate 中的数据类在哪里......? 感谢您的帮助,但我选择了不同的方向。我知道将数据放在应用程序委托中是不好的做法,所以我想出了如何在其他地方管理数据。 @devpreneur 听起来你解决了这个问题。但是,您的问题的原因并不是由于将数据放入应用程序委托的不良做法,您可能会再次遇到这种情况。在下面查看我的答案,以了解问题所在。 【参考方案1】:

你需要添加

#import "MasterViewController.h"

到 AppDelegate.m.

解释:

从您的错误消息中,我可以看出您正试图在 AppDelegate 的第 26 行访问 MasterViewController 的属性。但是,在您的 AppDelegate 类中,您只有一个前向声明(“@class MasterViewController”),并且您没有包含 MasterViewController 的实际头文件。这意味着 AppDelegate 知道在您的项目中某处存在一个名为 MasterViewController 的类......但这就是它所知道的全部。 AppDelegate 对 MasterViewController 的内容一无所知,即 MasterViewController 声明的属性或方法。

在头文件中使用@class 的原因是您可以在@interface 中拥有属性,例如

@property (nonatomic, strong) MasterViewController * appDelegatesReferenceToMasterViewController;

无需在 AppDelegate.h 中导入 MasterViewController.h。这样,您项目中的其他文件可以导入 AppDelegate.h,而不会无意中导入 MasterViewController.h。

翻译:

你在写代码:

@class MasterViewController;

就像对编译器说:

哟...编译器。我将在这个头文件中谈论一个叫做 MasterViewController 的东西,你不知道 MasterViewController 是什么……但不要误会兄弟。一切都很好。

但是,稍后在您编写代码后的.m文件中:

... masterViewController.dataController ...

编译器响应:

哇,哇,哇。我很高兴你在头文件中有一个 MasterViewController 类型的变量,因为你告诉我这一切都很好,不用担心。但是现在你在这里尝试使用我一无所知的 MasterViewController 的某些方面。我怎么知道这是否合法?不帅哥。

【讨论】:

感谢您的详细解释。我明白你的意思,很可能会再次犯这个错误。

以上是关于设置 App Delegate 以管理数据的主要内容,如果未能解决你的问题,请参考以下文章

在 App Delegate 中设置 Init VC?

iOS单元测试如何阻止App Delegate做事

block和delegate 通知区别

如何在 App Delegate 中将选项卡控制器设置为根控制器而不实例化(重新加载)它?

导航栏和导航工具栏不是来自 App Delegate

如何在 App Delegate 的“performFetchWithCompletionHandler”函数中从 Alamofire 获取数据?