我一直试图弄清楚如何使用脚本桥获取当前正在播放的歌曲的iTunes艺术作品.我已经达到了适用于某些歌曲的程度,但对于其他歌曲,我得到了一个SIGABRT.我不确定问题是什么,所以任何帮助都将不胜感激.这是我到目前为止:
iTunesApplication * iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; NSImage *songArtwork; iTunesTrack *current = [iTunes currentTrack]; iTunesArtwork *artwork = (iTunesArtwork *)[[[current artworks] get] lastObject]; if(artwork != nil) songArtwork = [artwork data]; else songArtwork = [NSImage imageNamed:@"Image.tiff"]; NSMenuItem *artworkMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""]; [songArtwork setSize:NSMakeSize(128,128)]; [artworkMenuItem setImage:songArtwork]; [Menu insertItem:artworkMenuItem atIndex:0];
我可以使用一些歌曲,并在菜单项中很好地显示艺术作品,但对于其他人我在线上获得了一个SIGABRT:
[songArtwork setSize:NSMakeSize(128,128)];
控制台的输出如下:
2011-08-12 23:13:20.094 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70 2011-08-12 23:13:20.095 SongViewer[2146:707] An uncaught exception was raised 2011-08-12 23:13:20.096 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70 2011-08-12 23:13:20.097 SongViewer[2146:707] ( 0 CoreFoundation 0x00007fff86f11986 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff8b04cd5e objc_exception_throw + 43 2 CoreFoundation 0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190 3 CoreFoundation 0x00007fff86efe803 ___forwarding___ + 371 4 CoreFoundation 0x00007fff86efe618 _CF_forwarding_prep_0 + 232 5 SongViewer 0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483 6 CoreFoundation 0x00007fff86f089e1 -[NSObject performSelector:] + 49 7 CoreFoundation 0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274 8 AppKit 0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 9 AppKit 0x00007fff8d9d01b9 loadNib + 322 10 AppKit 0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:naMetable:withZone:ownerBundle:] + 217 11 AppKit 0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNaMetable:withZone:] + 141 12 AppKit 0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 13 AppKit 0x00007fff8dc42355 NSApplicationMain + 398 14 SongViewer 0x0000000100001882 main + 34 15 SongViewer 0x0000000100001854 start + 52 ) 2011-08-12 23:13:20.098 SongViewer[2146:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70' *** First throw call stack: ( 0 CoreFoundation 0x00007fff86f11986 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff8b04cd5e objc_exception_throw + 43 2 CoreFoundation 0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190 3 CoreFoundation 0x00007fff86efe803 ___forwarding___ + 371 4 CoreFoundation 0x00007fff86efe618 _CF_forwarding_prep_0 + 232 5 SongViewer 0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483 6 CoreFoundation 0x00007fff86f089e1 -[NSObject performSelector:] + 49 7 CoreFoundation 0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274 8 AppKit 0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 9 AppKit 0x00007fff8d9d01b9 loadNib + 322 10 AppKit 0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:naMetable:withZone:ownerBundle:] + 217 11 AppKit 0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNaMetable:withZone:] + 141 12 AppKit 0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 13 AppKit 0x00007fff8dc42355 NSApplicationMain + 398 14 SongViewer 0x0000000100001882 main + 34 15 SongViewer 0x0000000100001854 start + 52 ) terminate called throwing an exception(gdb)
如果有人知道可能出现什么问题,请告诉我!
解决方法
好的,我明白了.解决方案是使用API提供的NSData原始数据而不是NSImage.所以我用过:
NSImage *songArtwork = [[NSImage alloc] initWithData:[artwork rawData]];
而不是
songArtwork = [artwork data];