Я просматривал множество потоков, связанных со скриптовым мостом, в StackOverflow и в других местах, и, похоже, не смог добиться успеха в выяснении, почему блок кода Какао, который делает вызов скриптового моста в Finder, отсутствуетдольше работает корректно под 10.6.(Похоже, что в версии 10.5 аналогичная версия кода работала нормально, и я не знаю, что послужило причиной изменения поведения.)
По сути, я пытаюсь получить доступ к некоторым параметрам отображения для Finder.окно.У меня есть следующий блок кода в качестве моего теста.Я указываю на папку, которая отображается в виде значков, и когда я запускаю код, ни одна из ошибок не блокируется, но я всегда просто получаю бессмысленный ответ (iconSize = 0) в конце.
// Set up the Scripting Bridge
FinderApplication *finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.finder"];
// Get an HFS-style reference to a specified folder
// (folderPath is an NSString * containing a POSIX-style path to a folder)
NSURL *folderURL = [NSURL fileURLWithPath:folderPath];
NSString *folderPathHFS = (NSString *)CFURLCopyFileSystemPath((CFURLRef)folderURL, kCFURLHFSPathStyle);
// Get the Finder-native folder reference
FinderFolder* folder = [[finder folders] objectAtLocation:folderPathHFS];
if (folder == nil) {
NSLog(@"folder error: %@", [[folder lastError] localizedDescription]);
return;
}
// Get the Finder-native container window associated with the folder
[folder openUsing:finder withProperties:nil];
FinderFinderWindow *folderWindow = [[folder containerWindow] get];
if (folderWindow == nil) {
NSLog(@"folderWindow error: %@", [[folderWindow lastError] localizedDescription]);
return;
}
// Retrieve the view preferences for the folder
FinderIconViewOptions *ivo = [folderWindow iconViewOptions];
if (ivo == nil) {
NSLog(@"ivo error: %@", [[ivo lastError] localizedDescription]);
}
// Get the current icon size
int iconSize = (int)[ivo iconSize];
// Display the icon size in our label
if (iconSize > 0) {
NSLog(@"successfully retrieved icon size: %d", iconSize);
} else {
NSLog(@"couldn't retrieve icon size");
}
Версия этого кода на чистом AppleScript работает отлично, даже если указывает на одну и ту же папку:
tell application "Finder"
set aFolder to the folder "<HFS path to folder in question>"
set aFolderWindow to the container window of aFolder
set aIVO to the icon view options of aFolderWindow
return the icon size of aIVO
end tell
Мой инстинкт инстинкта заключается в том, что что-то создается или преобразуется странным образом, какон проходит через Мост Сценариев, но у меня совершенно нет идей о том, что проверять или где еще искать.Я попытался распечатать имена классов по пути, когда объекты извлекаются из Finder и помечать [SBObject *get]
вызовы в конце различных связанных с SB операторов присваивания, но безрезультатно.
Есть идеи?
ОБНОВЛЕНИЕ
ОК, поэтому я обнаружил , где ошибка генерируется в коде выше, хотя я не чувствую, что явсе это намного ближе к решению проблемы.Оказывается, ленивая оценка Scripting Bridge маскировала проблему.Если после получения ссылки на FinderWindow вы вставите следующие две строки кода:
NSString *test = [folderWindow name];
NSLog(@"Return value == %@; error message == %@", test, [[folderWindow lastError] localizedDescription]);
Затем Scripting Bridge попытается фактически выполнить поиск имени, завершится неудачно и получитвернемся с чуть более конструктивным сообщением об ошибке:
Return value == (null); error message == The operation couldn’t be completed. (OSStatus error -1700.)
Это круто (прогресс ?!), но все же не приближает меня к решению проблемы.,Это сообщение об ошибке указывает на то, что где-то есть проблема с AEcoercion, но я не уверен, как ее решить.Сгенерированный файл Finder.h (и AppleScript-словарь Finder) достаточно ясно понимают тот факт, что я должен получить ссылку на объект FinderWindow, и вывод объекта folderWindow
, кажется, подтверждает, что все в порядке вплоть доname
вызов.