- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在 StackOverflow 和其他地方浏览很多很多与 Scripting Bridge 相关的线程,但似乎无法在弄清楚为什么 Cocoa 代码块对 Finder 调用 Scripting Bridge 没有取得任何进展longer 在 10.6 下可以正常工作。 (类似版本的代码似乎在 10.5 下工作正常,我不知道是什么导致了行为的变化。)
基本上,我正在尝试访问 Finder 窗口的一些显示选项。我有以下代码块作为我的测试用例。我将它指向一个显示为图标的文件夹,当我运行代码时,没有错误 block 跳闸,但我总是在结束。
// 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 = [文件夹窗口名称];
NSLog(@"返回值 == %@; 错误信息 == %@", test, [[folderWindow lastError] localizedDescription]);
然后,Scripting Bridge 尝试实际执行名称检索,但失败了,并返回一条更具建设性的错误消息:
返回值==(空);错误信息 == 操作无法完成。 (OSStatus 错误 -1700。)
这太棒了(进步?!),但仍然没有让我离解决问题更近一步。该错误消息似乎表明某处存在 AEcoercion 问题,但我不确定如何继续解决它。生成的 Finder.h 文件(和 Finder 的 AppleScript 字典)都非常清楚我应该取回对 FinderWindow 对象的引用,并且打印出 folderWindow
对象似乎可以验证这一点在 name
调用之前一切正常。
最佳答案
看起来像 -objectAtLocation:
期待一个 NSURL
与 HFS 风格的路径相反:
"Discussion
This method is a generalization of
objectAtIndex:
for applications where the "index" is not simply an integer. For example, Finder can specify objects using aNSURL
object as a location. In OSA this is known as "absolute position," a generalization of the notion of “index” in Foundation—it could be an integer, but it doesn't have to be. A single object may even have a number of different "absolute position" values depending on the container."
我刚刚尝试了使用 NSURL 的代码,它工作正常。比如下面的代码
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
MDFinderApplication *finder = [SBApplication
applicationWithBundleIdentifier:@"com.apple.finder"];
NSURL *URL = [NSURL fileURLWithPath:[@"~/Desktop" stringByStandardizingPath]];
if (URL) {
MDFinderFolder *folder = [[finder folders] objectAtLocation:URL];
NSLog(@"folder == %@", folder);
}
}
产生了以下输出:
folder == <FinderFolder @0x482b00: FinderFolder
'furl'("file://localhost/Users/mdouma46/Desktop/") of application "Finder" (78829)>
(注意:我在创建 Finder.h 文件时使用了不同的参数(以防止混淆名称,如 FinderFinderWindow
),所以我的类名会略有不同)。
因此,如果将代码更改为以下内容,您的代码应该可以正常工作:
// Set up the Scripting Bridge
FinderApplication *finder = [SBApplication
applicationWithBundleIdentifier:@"com.apple.finder"];
// (folderPath is an NSString * containing a POSIX-style path to a folder)
NSURL *folderURL = [NSURL fileURLWithPath:folderPath];
// Get the Finder-native folder reference
FinderFolder* folder = [[finder folders] objectAtLocation:folderURL];
if (folder == nil) {
NSLog(@"folder error: %@", [[folder lastError] localizedDescription]);
return;
}
// Get the Finder-native container window associated with the folder
[folder reveal];
FinderFinderWindow *folderWindow = [folder containerWindow];
if (folderWindow == nil) {
NSLog(@"folderWindow error: %@", [[folderWindow lastError] localizedDescription]);
return;
}
// Retrieve the view preferences for the folder
// UPDATED: THE FOLLOWING WILL CAUSE AN "unrecognized selector":
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");
}
更新:应该不需要你添加 -get
称呼; get
就像在常规 AppleScript 中一样是隐含的/可选的/多余的。
我得到一个 unrecognized selector
尝试获取时出现错误消息 [folderWindow iconViewOptions]
:
-[SBObject iconViewOptions]: unrecognized selector sent to instance 0x10018e270
虽然您可以打印 FinderWindow 的属性:
NSLog(@"properties == %@", [finderWindow properties]);
产生类似的东西:
properties == {
bounds = "NSRect: {{173, 289}, {1241, 663}}";
closeable = 1;
collapsed = 0;
columnViewOptions = "<SBObject @0x1fc5d010: columnViewOptions of
FinderFinderWindow id 5696 of application \"Finder\" (78829)>";
currentView = "<NSAppleEventDescriptor: 'clvw'>";
floating = 0;
iconViewOptions = "<SBObject @0x1fc5d550: iconViewOptions of
FinderFinderWindow id 5696 of application \"Finder\" (78829)>";
id = 5696;
index = 2;
listViewOptions = "<SBObject @0x1fc5cca0: listViewOptions of
FinderFinderWindow id 5696 of application \"Finder\" (78829)>";
modal = 0;
name = Applications;
objectClass = "<NSAppleEventDescriptor: 'brow'>";
position = "NSPoint: {173, 289}";
resizable = 1;
sidebarWidth = 0;
statusbarVisible = 1;
target = "<FinderFolder @0x1fc5db10: FinderFolder \"Applications\"
of startupDisk of application \"Finder\" (78829)>";
titled = 1;
toolbarVisible = 1;
visible = 1;
zoomable = 1;
zoomed = 0;
}
关于objective-c - 在 10.6 下调用 Finder 的 Scripting Bridge 返回值不正确(但不会引发错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507711/
您知道,有时当您关闭 Finder 窗口或文档时,它会缩小到 Finder 中的显示位置。我希望我的应用程序也能够做到这一点。有这方面的API吗?我找不到。 最佳答案 执行摘要:如果您想要这种行为,请
我是 MAC 开发的新手,使用 finder 同步扩展并成功地为文件和文件夹设置了徽章图标,但我的问题是,当我完成将任何文件或文件夹同步到服务器时,徽章图标不会将表单同步更改为完成状态。请给我任何建议
在我的应用程序中,我喜欢让 OSX Finder 复制文件或文件夹。 (注意:我有充分的理由使用 Finder 而不是使用 shell cmds、NSWorkspace 或其他方式,因此无需在该方向上
我创建了一个简单的 Finder Sync (FinderSync) 扩展 (appex),默认情况下,应用程序沙盒处于打开状态(在 .entitlements com.apple.security.
我已经阅读了有关此主题的关于Stackoverflow的另一篇文章,但这几乎是所有基于Windows的工具。我当前正在运行Mac,在提到的所有工具中,http://xpath.alephzarro.c
我正在使用GORM查找器,但遇到运行时错误,我认为那是因为我的语法不正确。这是我遇到问题的代码行: def accountsOwnedByUser = AccountRecord.findAllWhe
我在 iPhone 上运行 iOS 应用程序,并记录了文档目录和 .plist 文件路径。刚刚更改了数据模型,所以我需要进入我的 .plist 并删除原始文件。 转到 Finder,按 Command
我目前正在开发一个实用程序,需要在对用户的默认设置进行一些更改后重新启动 Finder。 为了安全起见,我想在调用killall Finder(通过NSTask)之前检查Finder是否忙。如果 Fi
如何从特定文件夹中的 python 启动新的 Finder 窗口(或 Win 上的资源管理器)。我正在寻找的行为相当于 iTunes 或大多数其他程序想到它的轨道上下文菜单中的“在查找器中显示”链接。
进程文件: finder or finder.exe 进程名称: Microsoft Office Advanced Find Facility 进程类别:存在安全风险的进程 英文描述: f
我从 Swift 开始,我想创建一个应用程序来在 Finder 中加载选定的文件并执行一些操作,例如在 AppleScript 中。 糟糕的是我找不到任何关于如何做的信息。 在 AppleScript
我想从终端打开 Finder,并选择一个特定的文件。我知道通过使用 open .我可以在 Finder 中打开当前目录,但我也想在 Finder 窗口中选择一些文件。 我想要做的基本事情是运行一个脚本
我正在尝试使用 AppleScript 在 Finder 中打开一个文件夹。以下是我的代码。我想要文件夹 WorkSpace在 Finder 中打开,但它会打开父文件夹 /Volumes/MyMacD
我尝试使用 Application Scripting Bridge 让我的 Mac 进入休眠状态。代码如下所示: #import "Finder.h" FinderApplication *Fin
所以,我正在开发一个显示有关当前计算机的一些信息的应用程序,我希望它与 Finder 非常相似。当您在 Finder 中的计算机上获取信息时,会出现一个带有计算机大图标的预览部分。我希望能够在我的代码
我创建一个 cocoa 应用程序项目,并添加目标“Finder同步扩展”。然后“finderSync.appex”将被放入“.../Contens/Plugins/”文件夹中。但是当我启动应用程序时,
我希望能够为一些具有自定义扩展名的图像文件(例如,实际上是 TIFF 的 .canon 文件)生成自己的缩略图,以便 Finder 可以使用它们。 我不想更改文件内容(我对嵌入的 tiff 缩略图也不
我想要获取文件的“Kind”查找器。例如,对于文件“foo.css”,我想要字符串“CSS样式表”。 到目前为止,我正在做这样的事情: NSURL *fileURL = [[NSURL alloc]
通常为了分发一个简单的 cocoa 应用程序,我们对其发布文件夹进行 dmg 处理。当我们双击它时,它会安装其图像并显示一个不可编辑的窗口,其中包含 .app 和/或其他文件(例如 dSYM)。现在出
如何制作一个与 Finder 窗口具有相同基本结构的窗口(左侧的菜单/源列表,带有可以组织的图标,右侧的较大 View 中的内容)? 最佳答案 要复制 Finder 的内容 View ,请使用: 图标
我是一名优秀的程序员,十分优秀!