我遇到了LSSharedFileListInsertItemURL的问题。我正在尝试将一个项目添加到Finder侧边栏,这很棒。它唯一不做的是更改侧栏中项目的名称。我正在将“FolderName”作为参数推送,但在运行此函数后,该项目不会重命名。它会使用名称闪烁一秒钟,但很快就会更改回其实际名称。我尽可能多地搜索找到解决方案并且没有提出任何问题。如果有人发现我的代码存在问题或者有“黑客”来解决这个问题,请告诉我。
-(void) addPathToSharedItem:(NSString *)path
{
CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
// Create a reference to the shared file list.
LSSharedFileListRef favoriteItems = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);
if (favoriteItems) {
//Insert an item to the list.
CFStringRef mdcName = CFSTR("FolderName");
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(favoriteItems, kLSSharedFileListItemLast, mdcName, NULL, url, NULL, NULL);
if (item){
CFRelease(item);
}
}
CFRelease(favoriteItems);
}
答案 0 :(得分:1)
[我知道很久以前就问过这个问题,但似乎没有其他地方可以找到正确的答案。]
在LSSharedFileListInsertItemURL实际上是已知错误reported to Apple in 2013之后,Finder未刷新收藏夹名称。
我们发现手动将任何其他文件夹添加到收藏夹会刷新“收藏夹”部分并显示先前通过LSSharedFileListInsertItemURL设置的正确名称。
一个非常脏的解决方法就是通过插入任何其他项目然后立即删除它来自动化它。
以下代码(在C ++中很抱歉,但它可以轻松移植到Objective C)实现了这个:
// Create a reference to the shared file list.
LSSharedFileListRef favoriteItems = LSSharedFileListCreate(NULL, kLSSharedFileListFavoriteItems, NULL);
if (!favoriteItems)
return false;
//Insert an item to the list.
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL( favoriteItems, //Insert in this list
kLSSharedFileListItemBeforeFirst, //Here
(CFStringRef) shortCurtNameNS, //Shortcut name
NULL, //Icon
url, //URL / path
NULL,
NULL);
if (item)
CFRelease(item);
// Here it goes dark. Really dark.
// Finder does not refresh Favorites until another one is inserted "manually".
// The following lines just emulates this : insert another item then immediately remove it. This will refresh favs.
// KarmaPoints--;
CFURLRef dummy = (__bridge CFURLRef)[NSURL fileURLWithPath:@"/"];
NSString * dummyName = [NSString stringWithCString:"Root" encoding:[NSString defaultCStringEncoding]];
LSSharedFileListItemRef dummyItem = LSSharedFileListInsertItemURL( favoriteItems, //Insert in this list
kLSSharedFileListItemLast, //Here
(CFStringRef) dummyName, //Shortcut name
NULL, //Icon
dummy, //URL / path
NULL,
NULL);
// Remove it
LSSharedFileListItemRemove(favoriteItems, dummyItem);
if (dummyItem)
CFRelease(dummyItem);