2009-12-23 3 views
3

У меня есть класс AppController, который выглядит как просмотр/управление в моем приложении обычным способом.Objective C связь между классами

Там кнопка на главном окне моего приложения в IB, который вызывает AppController для создания экземпляра нового контроллера окна (accountPanelController) и показать, что среднее окно:

- (IBAction) showAccountPanel:(id) sender 
{ 
    //Is accountController nil? 
    if (!accountPanelController) { 
     accountPanelController = [[AccountPanelController alloc] init]; 
    } 

    [accountPanelController showWindow:self]; 
} 

Когда это новое окно сделано с, я хочу отправить данные, собранные от моего вторичного контроллера окна к способу в AppController:

- (IBAction) close: (id) sender 
{ 
    NSLog(@"Close detected"); 
    [AppController addAccount:0]; 
    [self close]; 
} 

Однако, когда я пытаюсь вызвать метод addAccount в AppController от нового контроллера окна, я получаю «„AppController“не может ответитьна предупреждение «+ addAccount».

Это похоже на то, что AppController является классом, а не экземпляром объекта, поскольку метод в AppController вызывается -addAccount (а не + addAccount, о котором сообщается в предупреждении). Действительно, если я изменяю имя целевого метода на + addAccount вместо -addAccount, предупреждение не появляется (но программа вылетает при выполнении).

Учитывая, что я фактически не создаю экземпляр AppController (думаю, это происходит как-то во время инициирования NIB), есть ли у кого-нибудь идеи, как я могу отправить данные методу AppController? Уведомления кажутся излишними ...

Большое спасибо.

ответ

4

Я рекомендую следующее введение статьи о Mac Dev Center от Apple: Communicate with Objects - #Notifications
Update:
Я указал ссылку на соответствующий якорь (Notifications).

Проблема в вашем примере кода заключается в том, что вы вызываете метод класса (с символом +), но вы реализуете метод экземпляра (-).
Таким образом, было бы простым исправлением, чтобы получить (общий) экземпляр вашего AppController (возможно, self в вашем коде) и отправить ему сообщение addAccount:.
Но я рекомендую вам сначала прочитать статью.

Возможно, вы сможете решить вашу проблему, отправив уведомление (NSNotification) со своего мнения на ваш контроллер.

Update:
Еще одно интересное чтение для вас может быть this SO question regarding the difference between class methods and instance methods.

+0

Большое спасибо. Я прочитал все ссылки. Корень в том, что AppController - это класс, который я не создавал, но который IBuilder указывает на (IBAction).Поэтому у меня нет способа указать экземпляр, создаваемый AppController при его создании. Уведомления работа. Есть ли более простой способ? Даже Hillegass использует уведомления в своей главе на панелях. Люди должны получать данные из двухстороннего окна во многих приложениях, чтобы это было распространено? Я не знаком с общими экземплярами и внимательно посмотрел на какой-то документ. Знаете ли вы о том, что может помочь? Как ниже, я попробовал [self addAccount] не повезло. Еще раз спасибо. –

+0

Возможно, вы можете использовать [NSApplication sharedApplication], который является общим экземпляром делегата приложения. Но я думаю, что использование уведомлений - это то, что нужно сделать здесь. –

+0

У вас нет уведомлений, работающих сегодня. Благодарю. –

1

Просто поставить метод intiWithOtherController и добавить его Herre:

accountPanelController = [[AccountPanelController alloc] initWithOtherController:self]; 

просто передать себя, так что вам нужно что-то вроде этого:

(AccountPanelController *) initWithOtherController:(OtherController *) 

теперь у вас есть указатель на otherController и вы можете сделать :

[otherController addAccount:0] 
+0

Получил эту работу. Ницца и просто. Благодарю. Только сцепное устройство каким-то образом удерживает указатель otherController после возвращения initWithOtherController, чтобы я мог использовать его в методе close из окна. –

Смежные вопросы