0

我在 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.)"

为什么?

4

2 回答 2

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 并检查播放列表是否为空来更加严格——因为它是一个新创建的播放列表,这就是您想要的。

于 2010-04-13T19:02:12.590 回答
0

我有一个应用程序可以执行此操作并在 10.5 上运行。我可以看到您的代码和我的代码之间的唯一区别是最后一行。我使用以下...

[userPlaylistsArray insertObject:playlistToReturn atIndex:0];

试试看...

于 2010-04-13T19:02:21.940 回答