为ViewController提供对数据和控制器类的访问

时间:2013-07-05 01:42:25

标签: ios xcode uiviewcontroller appdelegate

我正在尝试通过将我已经成功完成的Apple教程(BirdSighting)修改到我自己的应用程序中来学习我的iOS项目的良好MVC实践。他们为Model和Controller构建了NSObject类。他们的第一个ViewController是TableVC。在 appDelegate.m 中,他们通过将firstViewController连接到dataController来更改 didFinishLaunchingWithOptions 。在我的应用程序中,我不希望我的第一个ViewController成为一个表,只是一个基本的VC。我收到警告:指针类型不兼容。这是代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
   //  enterView is initial UIViewController
   enterView *firstViewController = (enterView *)[[navigationController viewControllers] objectAtIndex:0];
   //  dBcontrols is a NSObject class
   dBcontrols *aDataController = [[dBcontrols alloc] init];
   firstViewController.dataController = aDataController;   //  <-- ERROR Here.
   return YES;
}

我的第一个ViewController, enterView ,在标题中有这个:

@class contacts;
@class dBcontrols;
@interface enterView: UIViewController
@property (strong, nonatomic) enterView *dataController;

我的Model类,联系人和我的Controller,dBcontrols几乎与Apple教程中的相同。但是ViewController没有访问Controller。在 enterView.m 中有以下这些行:

#import "enterView.h"
#import "contacts.h"
#import "dBcontrols.h"

@interface enterView ()
@end

@synthesize dataController = _dataController;

- (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
   NSInteger  cntC = [self.dataController countContacts];   <--  ERROR here
   NSLog(@"number of contacts = %d", cntC );

}

有一个错误说:没有可见的接口声明了选择器'countContacts',这是一个在 dBcontrols.m 中找到的Controller方法,如下所示:

- (NSUInteger)countContacts {
   return [self.masterContactList count];
}

以下是标题中的内容, dBcontrols.h

@class contacts;
@interface dBcontrols: NSObject
   - (NSUInteger)countContacts;
   . . .
@end

我的问题是从TableVC切换到基本VC作为第一个VC吗?我认为这是本教程中唯一相关的变化。我该如何解决?我希望我已经提供了足够的信息。 非常感谢! 瑞克

2 个答案:

答案 0 :(得分:1)

看起来你正在混淆你的课程。在你的app delegate中,你正在创建一个名为aDataController的dBcontrols实例,但在enterView的头文件中你有dataController是enterView类的一个实例 - 我想你可能意味着那里的dBcontrol。

顺便说一下,如果你坚持使用大写字母来命名类的命名惯例,你的代码会更容易阅读。

答案 1 :(得分:0)

你需要检查这两件事:

  • 确保在enterView.m中导入dBcontrols.h

    #import“dBcontrols.h”

  • 确保在dBcontrols.h

  • 中声明了countContacts