2012-01-17 3 views
2

Я хочу обновить иконку для конкретного файла/папки в приложении Finder.Как обновить окно поиска?

FNNotifyByPath((const UInt8 *)folderPath, kFNDirectoryModifiedMessage, kNilOptions); 

FNNotifyByPath не работает для этого. Теперь я пытаюсь с AppleScript

+(void) refreshIconForItem : (NSString *)itemPath 
{ 
    NSString *source=[NSString stringWithFormat:@"tell application \"Finder\" to update \"%@\"",[NSString stringWithUTF8String:itemPath]]; 
    NSAppleScript *update=[[NSAppleScript alloc] initWithSource:source]; 
    NSDictionary *err; 
    [update executeAndReturnError:&err]; 
} 

, но эта функция также не работает.

Может ли кто-нибудь помочь мне?

+0

вы нашли это решение? Пожалуйста, дайте мне знать, какой скрипт работает для этого. Потому что я использовал почти весь скрипт, но не работал с каким-либо скриптом. Любая помощь приветствуется. !! – jigs

+0

@Jigar вы можете использовать http://stackoverflow.com/a/15541439/944634. Искатель обновления яблочный скрипт не работает на 10.8 и выше –

ответ

5

Вы проверили значение словаря err после звонка executeAndReturnError:?

Правильный синтаксис AppleScript будет:

@"tell application \"Finder\" to update POSIX file \"%@\""

EDIT TO ADD: В качестве альтернативы, вы могли бы опуститься до уровня AppleEvent:

OSStatus SendFinderSyncEvent(const FSRef* inObjectRef) 
{ 
    AppleEvent theEvent = { typeNull, NULL }; 
    AppleEvent replyEvent = { typeNull, NULL }; 
    AliasHandle itemAlias = NULL; 
    const OSType kFinderSig = 'MACS'; 

    OSStatus err = FSNewAliasMinimal(inObjectRef, &itemAlias); 
    if (err == noErr) 
    { 
     err = AEBuildAppleEvent(kAEFinderSuite, kAESync, typeApplSignature, 
      &kFinderSig, sizeof(OSType), kAutoGenerateReturnID, 
      kAnyTransactionID, &theEvent, NULL, "'----':alis(@@)", itemAlias); 

     if (err == noErr) 
     { 
      err = AESendMessage(&theEvent, &replyEvent, kAENoReply, 
       kAEDefaultTimeout); 

      AEDisposeDesc(&replyEvent); 
      AEDisposeDesc(&theEvent); 
     } 

     DisposeHandle((Handle)itemAlias); 
    } 

    return err; 
} 
+1

Спасибо, что он работает отлично. Должен ли я использовать метод executeAndReturnError: или я должен запустить applescript, используя NSTask? –

+0

Я бы использовал executeAndReturnError :, или способ AppleEvent, который я добавил. – JWWalker

+0

Благодарим за код AppleEvent. не могли бы вы предложить мне документацию для AppleEvents? так что я могу также узнать это. –