【问题标题】:NSRunningApplication - TerminateNSRunningApplication - 终止
【发布时间】:2010-12-01 15:55:26
【问题描述】:

我将如何使用NSRunningApplication?我有一些与启动应用程序相反的东西:

[[NSWorkspace sharedWorkspace] launchApplication:appName];

但我想关闭一个。我在调试 NSRunningApp 的代码时遇到错误:

NSRunningApplication *selectedApp = appName;
[selectedApp terminate];

有什么问题吗?如果有请指出以及如何解决。

【问题讨论】:

  • 这实际上是另一个问题的副本(同样的问题:无法向错误类的实例发送消息):stackoverflow.com/questions/930929/isequaltostring-cocoa-error
  • @彼得:只有解决方案是重复的,问题是唯一的。
  • 好的,伙计们,我们可以专注于这个问题吗...没有人回复我...看看我下面GS回复的最新帖子!!!!

标签: objective-c cocoa xcode terminate


【解决方案1】:

您将变量selectedApp 分配给NSString。字符串没有 - (void)terminate 方法,因此它失败了。你必须得到一个指向应用程序的NSRunningApplication 实例。

NSWorkspace *sharedWorkspace = [NSWorkspace sharedWorkspace];
NSString *appPath = [sharedWorkspace fullPathForApplication:appName];
NSString *identifier = [[NSBundle bundleWithPath:appPath] bundleIdentifier];
NSArray *selectedApps =
       [NSRunningApplication runningApplicationsWithBundleIdentifier:identifier];
// quit all
[selectedApps makeObjectsPerformSelector:@selector(terminate)];

【讨论】:

  • 好的,对不起,如果我没有得到它......就像我的代码只从名称打开应用程序一样,类似的东西如何工作?只是终止。因为我不想将路径添加到需要关闭的应用程序..
  • 我的新示例应该功能齐全
  • 好的,我得到了这个错误,即 NSRunningApplication 可能无法响应 +runningApplicationWithBundleIdentifier
  • 修复了,应该多关注一下api吧。
  • 好的,所以我没有收到任何错误,但是当我在我的文本框(appNAme)中输入应用程序的名称(例如 safari)并按回车键(退出)时,它就退出了我的程序,而不是 safari。
【解决方案2】:

appName 指的是什么?如果它的字面意思是NSString,那么这将不起作用。

由于NSRunningApplication 是一个类,您必须创建一个实例来向它发送一个实例方法,就像对任何其他类一样。

您可以使用三种类方法(参见the docs)返回NSRunningApplication 实例:

+ runningApplicationWithProcessIdentifier:
+ runningApplicationsWithBundleIdentifier:
+ currentApplication

除非您想要基于当前应用程序的 NSRunningApplication 实例,否则您可能会发现前两个类方法最有用。

然后您可以将terminate 消息发送到NSRunningApplication 实例,该实例将尝试退出为其配置的应用程序。

【讨论】:

  • 是的,我就是这么说的——您需要使用上述方法之一创建一个NSRunningApplication 实例。
  • 好的,我有这个: NSString *identifier = [[NSBundle bundleWithPath:appName] bundleIdentifier]; NSRunningApplication *selectedApp = [NSRunningApplication runningApplicationWithBundleIdentifier:identifier]; [selectedApp 终止]; dis 还是不行,...
  • appName 是完整路径吗?您必须将完整路径传递给bundleWithPath:,它才能返回一个NSBundle 实例,然后您可以调用bundleIdentifier。如果路径不完整(或者不是有效的捆绑包),那么它将返回nil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2018-01-12
  • 2019-03-29
  • 2015-10-28
  • 2014-08-15
  • 2015-09-09
  • 2022-01-26
相关资源
最近更新 更多