Почему applicationWillFinishLaunching в моем классе NSApplicationDelegate никогда не вызывается? - PullRequest
1 голос
/ 11 февраля 2010

main.m

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    return NSApplicationMain(argc,  (const char **) argv);
}

CoolClass.h

#import <Cocoa/Cocoa.h>

@interface CoolClass : NSObject <NSApplicationDelegate> {

}
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification;
@end

CoolClass.m

#import "CoolClass.h"

@implementation CoolClass
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification {
    NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE");
}

@end

Я тоже пробовал это с «applicationWillFinishLaunching», но все равно не повезло. Любая помощь вообще будет оценена. Благодаря.

Ответы [ 5 ]

6 голосов
/ 11 февраля 2010

Вы должны определить свой CoolClass как делегат приложений в Интерфейсном Разработчике (Ctrl + Перетащите из экземпляра приложения в ваш экземпляр CoolClass

5 голосов
/ 13 февраля 2010

Что вам не хватает, так это то, что принятие протокола делает объекты типа CoolClass готовыми функционировать в качестве делегатов любого объекта NSApplication (при условии, что вы выполните декларацию и реализуете все необходимые методы протокола). Объявление соответствия протоколу также предотвращает предупреждения компилятора, когда вы устанавливаете экземпляры класса в качестве делегата приложения.

Но для того, чтобы конкретный объект приложения (скажем, общий объект NSApplication, который создает для вас Cocoa) знал, чтобы отправлять сообщения из протокола на конкретный объект CoolClass, вы должны установить объект, для которого вы хотите получать эти сообщения, как определенный делегат объекта приложения.

Это означает, что за некоторое время до того, как приложение отправит сообщения, которые вы хотите получить, что-то должно создать экземпляр объекта CoolClass - назовите его c - и скажите приложению: «Эй, ваш делегат c здесь, так что отправляйте сообщения делегата маленькому валенщику с этого момента. "

То, что сводится к тому, что эти строки кода должны выполняться до завершения запуска приложения:

CoolClass *c = [[CoolClass alloc] init];
[[NSApplication sharedApplication] setDelegate:c];

Самый простой способ добиться этого - позволить Интерфейсному Разработчику сделать всю работу за вас: пусть перо MainMenu создает экземпляр CoolClass, а также устанавливает классный объект класса в качестве делегата приложения при загрузке кончика, как предлагали другие.

Для этого откройте MainMenu.xib. Перетащите пользовательский объект в XIB и измените его класс на CoolClass в инспекторе. Удерживая клавишу Ctrl (или перетащите правой кнопкой мыши) от объекта приложения в XIB к объекту CoolClass, выберите «делегировать». Сохраните, соберите и запустите.

1 голос
/ 11 февраля 2010

applicationDidFinishLaunching - это метод экземпляра, а не метод класса. То есть вам понадобится экземпляр вашего класса, чтобы получить это сообщение. Плюс, это не может быть просто -записью; Ваше приложение должно знать о вашем экземпляре и знать, что оно должно отправлять ему сообщения делегата. Самый простой и самый распространенный способ сделать это ...

Во-первых, вы создадите экземпляр вашего CoolClass. Откройте файл MainMenu.nib вашего приложения в Интерфейсном Разработчике. Перетащите «Объект» (он будет выглядеть как синий куб) из окна библиотеки. Выберите его и используйте вкладку «Удостоверение» Инспектора, чтобы изменить его класс с NSObject на CoolClass. Теперь у вас есть экземпляр вашего CoolClass.

Теперь вы установите этот экземпляр в качестве делегата приложения. Перетащите управление из «Приложения» (все еще в Интерфейсном Разработчике) в ваш новый экземпляр CoolClass. Появится окно (с указанием точек приложения, которые могут быть подключены к вашему объекту). Выберите «делегировать». Теперь ваше приложение имеет экземпляр вашего CoolClass, установленный в качестве его делегата, и, таким образом, ваш applicationDidFinishLaunching будет работать.

0 голосов
/ 13 февраля 2010

Для начала: ваш звонок на NSApplicationMain должен быть заключен в NSAutoreleasePool. У вас будут проблемы, если вы этого не сделаете.

0 голосов
/ 13 февраля 2010

Я ценю, что вы, возможно, пытаетесь учиться с нуля, но почему вы не просто создали новый проект, используя один из шаблонов XCode? Все это настраивается для вас с самого начала. Жизнь включает в себя достаточно отладки, без необходимости добавлять больше на нее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...