我在10.5中遇到了Scripting Bridge框架的问题。具体来说,我使用此代码在iTunes中创建一个新的用户播放列表:
NSDictionary *propertiesDict = [NSDictionary dictionaryWithObject:@"playlistName" forKey:@"name"];
playlistToReturn = (iTunesUserPlaylist*)[[[iTunesApp classForScriptingClass:@"user playlist"] alloc] initWithProperties:propertiesDict];
SBElementArray *sourcesArray = [iTunesApp sources];
iTunesSource *librarySource = [sourcesArray objectAtIndex:0];
SBElementArray *userPlaylistsArray = [librarySource userPlaylists];
[userPlaylistsArray addObject:playlistToReturn];
此代码在10.6中正常工作。播放列表已正确创建,我可以稍后添加歌曲。
但是,在10.5上,会生成错误:
Apple event:'core'\'crel'{
'kocl':'cUsP',
'insh':'insl'{
'kobj':'obj '{
'want':'cUsP',
'from':'obj '{
'want':'cSrc',
'from':'null'(),
'form':'ID ',
'seld':42 },
'form':'indx',
'seld':'abso'($206C6C61$) },
'kpos':'end ' },
'prdt':{
'pnam':'utxt'("playlistName") }
};
Error Domain=SBError Code=-10014 UserInfo=0x152c8cb0 "Operation could not be completed. (SBError error -10014.)"
为什么?
答案 0 :(得分:0)
由于10.5显然无法很好地处理对象的创建,因此我修改了创建空播放列表的方式。相反,我所做的是为空播放列表创建一个XML对象,然后使用Scripting Bridge的add:to:命令成功添加播放列表。然后我使用Scripting Bridge搜索新创建的播放列表。这是一些相关的代码:
NSDictionary *innerDictionary = [NSDictionary dictionaryWithObject:playlistName forKey:@"Name"];
NSArray *innerArray = [NSArray arrayWithObject:innerDictionary];
NSDictionary *outerDictionary = [NSDictionary dictionaryWithObject:innerArray forKey:@"Playlists"];
[outerDictionary writeToFile:pathToWriteXMLFile atomically:YES];
[iTunesApp add:[NSArray arrayWithObject:[NSURL fileURLWithPath:pathToWriteXMLFile]] to:nil];
这样就可以在10.5上成功创建播放列表。然后,实际检索iTunesUserPlaylist *对象:
SBElementArray *playlistArray = [[[iTunesApp sources] objectAtIndex:0] userPlaylists];
NSPredicate *playlistPredicate = [NSPredicate predicateWithFormat:@"name == %@",playlistName];
NSArray *playlistSearchArray = [playlistArray filteredArrayUsingPredicate:playlistPredicate];
请注意,您可以通过循环播放playlistSearchArray并检查播放列表是否为空来更加严格 - 因为它是新创建的播放列表,这就是您想要的播放列表。
答案 1 :(得分:0)
我有一个应用程序执行此操作并在10.5上工作。我能在你的代码和我的代码之间看到的唯一区别是最后一行。我使用以下内容......
[userPlaylistsArray insertObject:playlistToReturn atIndex:0];
试一试......