2013-07-05 4 views
0

Я пытаюсь изучить хорошую практику MVC для своих проектов iOS, изменив учебник Apple (BirdSighting), который я успешно завершил, в свое приложение. Они построили классы NSObject для модели и контроллера. Их первый ViewController - это TableVC. В appDelegate.m они изменили сделалиFinishLaunchingWithOptions, подключив firstViewController к dataController. В моем приложении я не хочу, чтобы мой первый ViewController был таблицей, а просто базовым VC. Я получаю предупреждение: Несовместимые типы указателей. Вот этот код:Предоставление доступа ViewController к классам данных и контроллеров

- (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; 

Мой класс модели, контакты, и мой контроллер, dBcontrols, практически такие же, как и в учебник Apple. Но ViewController не имеет доступа к контроллеру. В 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. м так:

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

Вот что в заголовке, dBcontrols.h:

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

вызвала мою проблему при переходе от TableVC к основным КАМ как первый КИ? Я думаю, что это единственное релевантное изменение из учебника. Как я могу это исправить? Надеюсь, я предоставил достаточно информации. Большое спасибо! Рик

ответ

1

Похоже, вы смешиваете свои классы. В делетете приложения вы создаете экземпляр dBcontrols, называемый aDataController, но в заголовочном файле enterView у вас есть dataController, являющийся экземпляром класса enterView. Думаю, вы, вероятно, имели в виду dBcontrols.

Кстати, ваш код будет легче читать, если вы придерживаетесь соглашения об именах с использованием заглавных букв, чтобы начать имена классов.

+0

Отлично! Вот и все. Спасибо за помощь и совет. –

0

Вы должны проверить эти две вещи:

  • Убедитесь, что вы импортируете dBcontrols.h в enterView.m

    #import "dBcontrols.h"

  • Удостоверьтесь, что там указаноКонтакты объявлены в dBcontrols.h

+0

Спасибо за ответ, rakmoh. Все было уже хорошо. Я отредактировал приведенные выше вопросы, чтобы показать их. –