2009-09-26 3 views
2

Как бы использовать NSRunningApplication? У меня есть что-то противоположное тому, что запускает приложение:NSRunningApplication - Terminate

[[NSWorkspace sharedWorkspace] launchApplication:appName]; 

, но я хочу его закрыть. Я получаю сообщение об ошибке, когда я отладки кода для NSRunningApp, который заключается в следующем:

NSRunningApplication *selectedApp = appName; 
[selectedApp terminate]; 

Есть ли что-то не так? если есть, пожалуйста, укажите его и как его исправить.

+0

Это на самом деле дубликат этого другого вопроса (такая же проблема: не удается отправить сообщение экземпляру неправильного класса): http://stackoverflow.com/questions/930929/isequaltostring-cocoa-error –

+0

@ Peter: только решение является дубликатом, вопрос уникален. –

+0

Хорошо, ребята, мы можем сосредоточиться на вопросе ... Никто не отвечает мне ... Посмотрите мое последнее сообщение ниже на ответ GS !!!! – lab12

ответ

8

Вы назначаете переменную selectedApp a 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)]; 
+0

ОК, извините, если я не получу его ... Как и мой код, который открывает приложение только из имени, как будет работать что-то подобное? просто прекращение. Потому что я не хочу добавлять путь к приложению, которое нужно закрыть .. – lab12

+0

мой новый пример должен быть полностью функциональным –

+0

ok Я получаю этот erro, который NSRunningApplication не может ответить на + runningApplicationWithBundleIdentifier – lab12

5

Что именно appName см.? Если это буквально относится к NSString, тогда это не сработает.

С NSRunningApplication это класс, вам нужно создать экземпляр, чтобы отправить его как метод экземпляра, как с любым другим классом.

Есть три метода класса (см the docs), вы можете использовать, чтобы вернуть NSRunningApplication экземпляр:

+ runningApplicationWithProcessIdentifier: 
+ runningApplicationsWithBundleIdentifier: 
+ currentApplication 

Если вы не хотите NSRunningApplication экземпляра на основе текущего приложения вы, вероятно, найти первые два метода класса наиболее полезный.

Затем вы можете отправить сообщение terminate в экземпляр NSRunningApplication, который попытается закрыть приложение, для которого он был настроен.

+0

appname - это NSSTring .. – lab12

+0

Да, это было то, что я говорил - вам нужно создать экземпляр 'NSRunningApplication', используя один из вышеуказанных методов. –

+0

ok У меня есть это: NSString * identifier = [[NSBundle bundleWithPath: appName] bundleIdentifier]; \t \t NSRunningApplication * selectedApp = [NSRunningApplication runningApplicationWithBundleIdentifier: identifier]; \t \t [selectedApp terminate]; dis все еще не работает, ... – lab12

Смежные вопросы