Frage

Ich bin nur zu lernen, wie ScriptingBridges zu verwenden. Ich habe eine Methode, dass die Lautstärke langsam auf iTunes verblasst, und möchte es eine Kategorie machen, damit ich folgendes tun:

iTunesApplication* iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
[iTunes lowerVolume:50 speed:1];

habe ich eine neue Kategorie für NSSpeechSynthesizer das funktioniert, aber ich kann diese eine nicht bekommen. Ich halte die folgenden Build-Fehler bekommen:

"_OBJC_CLASS_$_iTunesApplication", referenced from:
l_OBJC_$_CATEGORY_iTunesApplication_$_iTunesApplicationAdditions in iTunesApplication.o
objc-class-ref-to-iTunesApplication in iTunesApplication.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Gibt es etwas Besonderes kann ich tun, damit es funktioniert, da ich nicht die Symbole enthalten kann?

Danke,
Ryan Pendleton

UPDATE: Ich fand nur eine Lösung, die unten ist. Es geht um MethodSwizzling, so dass ich eine bessere Antworten offen bin, aber jetzt ist es alles, was ich habe.

War es hilfreich?

Lösung

Die Lösung fand ich war es, die Objective-C-Laufzeit-API zu verwenden. Ich bin sicher, dass es ein besserer Weg, dies zu organisieren, aber hier bin, wie ich es getan hätte:

Hier sind meine .h und .m-Dateien für die Kategorie zu schaffen. Beachten Sie, wie lowerVolume nicht eine tatsächliche Methode, sondern eine C-Funktion mit den Argumenten id self und SEL _CMD. Sie finden auch eine setupCategories Funktion bemerken. Wir werden später nennen.

// iTunes+Volume.h

#import <objc/runtime.h>
#import "iTunes.h"

void lowerVolume(id self, SEL _cmd, int dest, float speed);
void setupCategories();

@interface iTunesApplication (Volume)

- (void)lowerVolume:(int)dest speed:(float)speed;

@end

// iTunes+Volume.m

#import "iTunes+Volume.h"

void lowerVolume(id self, SEL _cmd, int dest, float speed)
{
    NSLog(@"Lower Volume: %i, %f", dest, speed);
}

void setupCategories()
{
    id object = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
    Class class = [object class];
    [object release];

    class_addMethod(class, @selector(lowerVolume:speed:), (IMP)lowerVolume, "@:if");
}
mit dem Objective-C-Laufzeit-API

Nun, da ich die Funktionen gemacht habe, muß ich tatsächlich sie zu der Klasse Scripting Brücke hinzuzufügen. Ich werde tun dies in main.m zu überprüfen, ob die Methoden bereit sind, verwendet werden, wenn die Laufschleife beginnt.

// main.m

#import <Cocoa/Cocoa.h>
#import "iTunes+Volume.h"

int main(int argc, char *argv[])
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    setupCategories();
    return NSApplicationMain(argc,  (const char **) argv);

    [pool drain];
}

Jetzt kann ich meine Methode verwenden, wo immer ich will, solange ich die Header-Dateien enthalten:

- (void)mute
{
    iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
    [iTunes lowerVolume:0 speed:1];
    [iTunes release];
}

Wenn irgendetwas davon macht keinen Sinn, nur mir sagen, und ich werde versuchen, es besser zu erklären.

Andere Tipps

Ich glaube, Sie brauchen -framework ScriptingBridge auf Ihre gcc Argumente aufzunehmen. Das hat es für mich zu kompilieren!

Wie oben erwähnt, kann man nicht einfach eine Kategorie iTunesApplication tun, weil es nicht bei der Kompilierung existiert, und auch, weil der Laufzeit-Klassenname ist ITunesApplication (Kapital „I“).

Die beste Lösung, die ich gefunden habe, ist Ihre Kategorie auf der Klasse zu tun, dass nicht existiert, SBApplication. Hier ist der Code, den ich, das funktioniert getestet und tue, was das ursprüngliche Beispiel versucht zu tun:

//  SBApplication+Extensions.h

@import ScriptingBridge;

@interface SBApplication (Extensions)

- (void)lowerVolume:(int)dest speed:(float)speed;

@end

//  SBApplication+Extensions.m

#import "iTunes.h"
#import "SBApplication+Extensions.h"

@implementation SBApplication (Extensions)

- (void)lowerVolume:(int)dest speed:(float)speed
{
    NSLog(@"Lower Volume: %i, %f", dest, speed);
}

@end

// Caller, say in AppDelegate

#import "SBApplication+Extensions.h"

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

    iTunesApplication *iTunesApp =
        [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];

    [iTunesApp lowerVolume:4 speed:3.3f];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top