2013-04-16 5 views
3

У меня проблема с LSSharedFileListInsertItemURL. Я пытаюсь добавить элемент на боковой панели Finder, который отлично работает. Единственное, чего он не делает, это изменить имя элемента на боковой панели. Я нажимаю «FolderName» в качестве аргумента, но после запуска этой функции элемент не переименовывается. Он мгновенно мигает с именем, но быстро возвращается к его фактическому имени. Я искал столько, сколько мог, чтобы найти решение для этого и ничего не придумал. Если кто-то видит проблему с моим кодом или имеет «взломать», чтобы получить эту работу, пожалуйста, дайте мне знать.LSSharedFileListInsertItemURL Не меняющееся имя

-(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

Почему вы удалить элемент сразу после его добавления? И почему вы создаете список дважды? – JWWalker

+0

Извините, у меня были те, кто проверил несколько вещей. Они были удалены. –

ответ

1

[Я знаю, что этот вопрос был задан давно, но кажется, не правильный ответ не может быть найти в другом месте.]

Finder не освежающие Любимое имя после LSSharedFileListInsertItemURL на самом деле известная ошибка reported to Apple in 2013.

Мы обнаружили, что добавление вручную любой другой папки в избранное обновит раздел «Избранное» и покажет соответствующее имя, ранее установленное через 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); 
+0

Спасибо за ответ. Мы закончили тем, что делали что-то подобное этому, но проект в конечном итоге потерял финансирование и был закрыт (черт побери, вы, государственные школьные системы!). –

Смежные вопросы