Какао: вызов метода из AppDelegate.m - PullRequest
2 голосов
/ 22 января 2010

Чтобы лучше понять запуск, очередь событий и методы в моем приложении, я пытаюсь написать программу, которая выполняет две вещи: воспроизводит звуковой сигнал при запуске и каждый раз, когда пользователь нажимает кнопку. Пока он играет только тогда, когда пользователь нажимает кнопку. Я знаю, что может быть несколько способов заставить звуковой сигнал запуска воспроизводиться, но для работы с кодом инициализации я хочу сделать это, вызвав мой метод звукового сигнала из метода applicationDidFinishLaunching файла AppDelegate.m.

Вот мой код:

Log.h

#import <Cocoa/Cocoa.h>


@interface Log : NSObject {

    IBOutlet id button;

}
-(void)beepAndLog;
-(IBAction)buttonPressed:(id)sender;

@end

Log.m

#import "Log.h"


@implementation Log

-(void)beepAndLog {

    NSLog(@"The Method Was Called!");
    NSBeep();

}

-(IBAction)buttonPressed:(id)sender {

    [self beepAndLog];
}
@end

И метод applicationDidFinishLaunching выглядит так:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    [Log beepAndLog];

}

В методе applicationDidFinishLaunching, однако, XCode предупреждает меня, что

«Журнал» может не отвечать на «+ beepAndLog»

и действительно, нет звукового сигнала, и журнал выглядит следующим образом:

MethodResponse [11401: a0f] + [Log beepAndLog]: нераспознанный селектор отправлено в класс 0x100002100

("MethodResponse" - это название моего проекта, кстати)

Я не уверен, почему Log не отвечает на beepAndLog, поскольку это один из его методов. Я неправильно это называю? У меня есть ощущение, что это будет болезненно очевидно для вас, более опытных людей. Я новичок. Любая помощь будет оценена! Спасибо!

1 Ответ

3 голосов
/ 22 января 2010

Есть две возможности. Либо вы определили beepAndLog как метод экземпляра, когда вам нужен метод класса, либо вы хотите вызывать его в экземпляре, когда вы вызываете его в классе.

Чтобы изменить его на метод класса, измените заголовок на:

+(void)beepAndLog;

и реализация:

+(void)beepAndLog {
    NSLog(@"The Method Was Called!");
    NSBeep();
}

Что касается другого решения, убедитесь, что у вас есть экземпляр класса Log (возможно, одноэлементный), и выполните что-то вроде:

[[Log logInstance] beepAndLog];

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

Log.h:

#import <Cocoa/Cocoa.h>

@interface Log : NSObject {
    IBOutlet id button;
}

+(Log *)logInstance;

-(void)beepAndLog;
-(IBAction)buttonPressed:(id)sender;

@end

Log.m:

#import "Log.h"

Log *theLog = nil;

@implementation Log

+(Log *)logInstance
{
    if (!theLog) {
        theLog = [[Log alloc] init];
        // other setup (like hooking up that IBAction)
    }
    return theLog;
}

-(void)beepAndLog {
    NSLog(@"The Method Was Called!");
    NSBeep();
}

-(IBAction)buttonPressed:(id)sender {
    [[Log logInstance] beepAndLog];
}
...