如何收集多个 openFile:(NSString *) 事件,然后对它们执行某些操作?

2024-03-14

我正在开发 Cocoa / Objective C++ 实用程序应用程序,并且想要处理多个(瞬时)文件打开。为了处理文件打开部分,我在我的AppDelegate.mm file:

- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
    NSLog(@"Opening file %@", filename);

    // more C++ code here

    return YES;
}

这些文件正在发送到 Quicksilver,我相信 Quicksilver 会将文件一个接一个地发送到应用程序(我认为 Finder 的“打开方式”会一次发送所有文件 - 因此可能使用handleOpenApplicationEvent:(NSAppleEventDescriptor *)event可能会更好) - 但无论如何,应用程序将一个接一个地接收多个文件 - 几乎是瞬时的 - 但不完全一起。这是 Console.app 显示的内容:

console-screenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png

由于文件是单独发送的,但是一个接一个地发送,我的问题是如何收集所有发送的文件并用它们做一件事?例如,我想收集发送的所有文件路径,然后将它们一起显示在对话框中。

我可以想到一个可能有效的概念:在接收到每个文件路径时将其存储在数组中。同时,当收到第一个时,在后台设置 1-2 秒的延迟,然后有一个对话框显示特定变量的所有内容。这个概念正确吗?或者有更好的方法吗?我是 Cocoa / Objective C++ 的新手 - 来自 PHP / Perl、bash 等语言。

我还想让这个辅助应用程序在完成后终止,但如果我正在等待文件,如何在收到最后一个文件时终止该应用程序?

如果我添加[NSApp terminate:nil]; to the applicationDidFinishLaunching函数应用程序实际上在仅收到第一个文件后终止。

更新 - 更多注释

这是使用后的控制台openFiles(复数)功能:图片7.png http://img24.imageshack.us/img24/5715/picture7zc.png http://img24.imageshack.us/img24/5715/picture7zc.png

使用 Quicksilver,我抓取一些文件,例如临时目录中的文件,然后选择“打开方式”,然后选择我正在创建的应用程序(名为 darn.app)

屏幕截图 2012-01-18 7.02.45 PM.png http://img9.imageshack.us/img9/4171/screenshot20120118at702.png http://img9.imageshack.us/img9/4171/screenshot20120118at702.png

但使用 Finder 似乎效果很好:

屏幕截图 2012-01-18 7.09.08 PM.png http://img832.imageshack.us/img832/8858/screenshot20120118at709.png http://img832.imageshack.us/img832/8858/screenshot20120118at709.png

...consolea.app 中的结果:

图片8.png http://img24.imageshack.us/img24/2812/picture8fe.png http://img24.imageshack.us/img24/2812/picture8fe.png

我确实询问了 Quicksilver 开发人员,他们确认 QS 确实通过“打开方式”操作一次打开一个文件,他们承认这与 Finder 的做法不同,但他们认为这是预期的。所以也许达伦是对的 - 计时器可能是最好的方法......


尝试实施-application:openFiles:代替-application:openFile:

- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
    NSLog(@"Opening multiple files %@", filenames);
}

它处理从 Finder 接收多个文件。

如果这不适用于您的 Quicksilver 设置,那么计时器可能是最好的方法。

在 AppDelegate 的 -init 方法中设置计时器。

@implementation MyAppDelegate {
    NSMutableArray* _files;
}

- (id)init {
    if (self = [super init]) {
        _files = [[NSMutableArray alloc] initWithCapacity:10];

        [self performSelector:@selector(processFiles) 
                   withObject:nil 
                   afterDelay:1.0]; // one second delay
    }
    return self;
}

在-application:openFile中:将文件收集到数组中并重置计时器。

- (BOOL)application:(NSApplication*)app openFile:(NSString*)filename {
    NSAssert(_files != nil, @"Timer already fired");

    [_files addObject:filename];

    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(processFiles) 
               withObject:nil 
               afterDelay:1.0];
} 

当计时器触发时,处理收集的文件,然后退出应用程序。

-(void)processFiles

    // Process the _files

    [_files release];
    _files = nil;
    [NSApp terminate:nil];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何收集多个 openFile:(NSString *) 事件,然后对它们执行某些操作? 的相关文章

随机推荐

  • 发送文件到 Mule 入站端点

    我正在尝试将包含文件和两个输入的表单发送到 Mule 入站端点 我有一个自定义处理器和一个定义如下的流程
  • 如何在ggplot中缩放独立层的颜色?

    我有一个数据集 记录了三座建筑物的能源使用情况 我有一个融化的数据框 可以从钻石组中模仿 data lt melt diamonds c depth table cut color id c cut color 本质上 我有来自三个不同建筑
  • Stripe 订阅取消和重新激活模型的最佳实践

    我正在开发一个应用程序 该应用程序有 Stripe 的每月订阅计划 我正在创建一个客户然后订阅供用户订阅 这对我来说效果很好 但我还没有弄清楚如何使用 Stripe 订阅创建取消流程 我使用了取消订阅按钮stripe subscriptio
  • 目标元素位于其他元素之前

    在我对此进行研究的过程中 我偶然发现这个线程 https stackoverflow com questions 10225364 select specific element before other element 但由于它已有 2
  • 用户完成编辑后如何从 EditText 上移除焦点?

    我的布局上有一个 EditText 用户输入一些文本并点击 完成 键后 我想从中删除闪烁的光标 我搜索了 StackOverflow 并找到了 3 个对我不起作用的答案 闪烁的光标仍然存在 private class MyOnKeyList
  • 虚拟环境下降级Python版本

    关于 TensorFlow 我总是遇到同样的错误 ModuleNotFoundError No module named tensorflow contrib 我实际上使用的是Python版本3 9不过网上看的好像是这个版本3 7是最后一个
  • 从 WHERE 子句中包含 Varying IN 列表的表中进行 SELECT

    我在正在处理的项目中遇到一个问题 我无法给您实际的代码 但我创建了一个可执行的示例代码 如下所示 Here temp and temp id有两张桌子 temp表包含逗号分隔的 id 列表 即VARCHAR2 temp id表包含实际的 i
  • 如何从散列的散列中提取键名?

    我有以下哈希值 HoH flintstones gt husband gt fred pal gt barney jetsons gt husband gt george wife gt jane his boy gt elroy simp
  • phpseclib 给了我一个奇怪的错误

    我试图使用这个 但它只是给了我这个错误 我不知道如何解决这个问题 警告 include once Math BigInteger php 无法打开流 否 这样的文件或目录 home www sfs web statistics public
  • linq .Value 可空对象必须有一个值。如何跳过?

    我有一些 linq 代码 有时null cbo3 ItemsSource empty Union from a in from b in CompleteData select b TourOpID Distinct select new
  • 在Swift中实现UILabel动画效果的最佳方法?

    我对 Swift 动画还很陌生 并且知道如何去做 但想看看其他人会如何做 我正在尝试创建这样的效果 当用户进入搜索栏时 搜索栏的占位符文本会缩小并向上移动到搜索字段上方 并更改为不同的颜色 像这样 http magicus xyz http
  • [String] 的 Swift 扩展?

    我正在尝试编写一个扩展方法 String 看来你不能延长 String 直接 类型 元素 限制为非协议类型 字符串 尽管我遇到了这个技巧 protocol StringType extension String StringType 但我仍
  • 在世界地图上方可视化网络[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 NodeXL 中有一个网络数据集 我试图在世界地图上可视化它 我的数据集有 具有国家属性的节点 链接 节点之间的未加权连接 我尝
  • 如何在 MATLAB 中迭代 n 维矩阵中的每个元素?

    我有个问题 我需要在 MATLAB 中迭代 n 维矩阵中的每个元素 问题是 我不知道如何对任意数量的维度执行此操作 我知道我可以说 for i 1 size m 1 for j 1 size m 2 for k 1 size m 3 等等
  • 使用 Angular 4.4.6 的开发模式下没有 NgForm 错误提供程序

    EDIT 我已经发现是什么导致了这个问题 我现在正在寻找一个解决方案来满足它 NOTE 此问题发生在开发模式下 即不是生产模式 并且不使用 aot 我正在使用这里的 更新 解决方案 https stackoverflow com a 463
  • 带css的透明滚动条

    现在使用此代码 以及此代码的许多变体 但滚动轨道变为深灰色 例如 222222 或接近此颜色 找到很多例子 但它们都给出相同的结果 Opera Chrome 和 Firefox 均显示此错误 怎么修 style 3 webkit scrol
  • HSTS 安全标头中的 max-age 属性是什么?

    HSTS 中 max age 的目的是什么 例如 Strict Transport Security max age 100 如果该值超过 100 会发生什么 有没有设置 max age 的最佳实践 thanks 有语义上不同的方式来发送
  • MPI:广播 long long int

    这个程序估计Pi通过将随机 飞镖 采样点 扔到一个圆或半径 1内切于长度 2的方板内的圆上 利用关系 Area of circle Area of Square Pi 4 我们可以使用表示为的相同关系来估计 Pi Darts Inside
  • 如何动态导入模块并将其名称作为字符串?

    我正在编写一个 Python 应用程序 它将命令作为参数 例如 python myapp py command1 我希望应用程序是可扩展的 也就是说 能够添加实现新命令的新模块 而无需更改主应用程序源 这棵树看起来像 myapp init
  • 如何收集多个 openFile:(NSString *) 事件,然后对它们执行某些操作?

    我正在开发 Cocoa Objective C 实用程序应用程序 并且想要处理多个 瞬时 文件打开 为了处理文件打开部分 我在我的AppDelegate mm file BOOL application NSApplication app