3

我正在开发一个带有拆分视图控制器的应用程序,并希望将主数据类存储在 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

主视图控制器.h

#import <UIKit/UIKit.h>

@class DetailViewController;
@class EventClassDataController;

@interface MasterViewController : UITableViewController

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

@end

主视图控制器.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
4

1 回答 1

0

您需要添加

#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 的某些方面。我怎么知道这是否合法?不帅哥

于 2013-01-21T22:28:41.673 回答