设置 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 两次。 粘贴import
和AppDelegate.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 中将选项卡控制器设置为根控制器而不实例化(重新加载)它?
如何在 App Delegate 的“performFetchWithCompletionHandler”函数中从 Alamofire 获取数据?