我發現的解決方案是使用Objective-C運行時API。我確信有更好的方法來組織這個,但這裏是我做的:
這裏是我的.h和.m文件用於創建類別。請注意,lowerVolume
不是一種實際的方法,而是具有參數id self
和SEL _CMD
的C函數。您還會注意到一個setupCategories
函數。我們稍後會打電話給你。
// 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");
}
現在我已經完成了這些功能,我需要使用Objective-C運行時API實際將它們添加到腳本橋接類中。我將在main.m
中執行此操作,以確保在運行循環啓動時可以使用這些方法。
// 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];
}
現在,我可以用我的方法的地方我想只要我包含頭文件:
- (void)mute
{
iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
[iTunes lowerVolume:0 speed:1];
[iTunes release];
}
如果任何這沒有任何意義,只是告訴我,我會試着更好地解釋它。
你能表現出更多的代碼,你都導入到你的頭和實現文件具體是什麼,以及如何你可以聲明你類別? – 2010-12-14 19:20:57
你有沒有想過這個?我得到了同樣的錯誤... – TooTallNate 2011-04-11 05:57:06
問題是,Objective-C類別需要擴展的類在構建時實現,而ScriptingBridge sdp生成的類不是這種情況 - 它們沒有'@ implementation'。我建議向Apple提交一份雷達,要求提供關於如何擴展sdp生成的類的技術說明。 – 2011-04-11 22:36:13