3

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);
}
4

1 に答える 1

1

[この質問がかなり前に出されたことは知っていますが、他の場所では適切な回答が見つからないようです。]

LSSharedFileListInsertItemURL の後で Finder がお気に入りの名前を更新しないことは、実際には 2013 年に Apple に報告された既知のバグです。

他のフォルダーをお気に入りに手動で追加すると、お気に入りセクションが更新され、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);
于 2015-10-30T13:42:38.090 に答える