Как проверить работоспособность приложения с помощью приложения для запуска NSWorkspace в Cocoa/Xcode/OBJ-C
У меня есть настройки для внешнего редактора, которые конечный пользователь может изменить в настройках. Поскольку я хочу сделать свое программное обеспечение умным, я хочу установить кнопку, которая запускает это внешнее программное обеспечение в отключенное состояние, если программное обеспечение недействительно (возможно, TextEdit был перемещен в утилиты или куда-то еще, или что-то еще идет не так, все может случиться, верно?)..
// Default setting: /Applications/TextEdit.app
[[NSWorkspace sharedWorkspace] launchApplication: [[NSUserDefaults standardUserDefaults] stringForKey: @"externalapp"]];
Я мог бы просто сделать простой тест на то, что местоположение является действительным и существует, но по какой-то причине я решил пойти по необычному пути и подумал, что должен быть тест, который проверяет это для правильного приложения - он не должен проверять это для TextEdit.app - потому что вся идея в том, что вы можете использовать практически любой редактор, который вам нужен. Именно поэтому он настраивается в первую очередь - но я просто хочу проверить, что мы не столкнемся с проблемами, которые могли бы иметь избежать этого теста.
И да, я знаю, что должен использовать TextEdit.app, чтобы открыть файл, но я еще не на этом этапе, так что еще ничего не создано для открытия, я сделаю это позже - на этом этапе этого достаточно чтобы увидеть, что идея работает, и я могу провести некоторое тестирование. Но я слушаю, если кто-то хочет поделиться хорошими идеями, о которых я, возможно, еще не думал с этим
1 ответ
Это как сделать тест, который я просил..
NSString *fileType = [sharedWorkspace typeOfFile: [[NSUserDefaults standardUserDefaults] stringForKey: @"externalapp"] error:nil];
if (( UTTypeEqual((CFStringRef)fileType, kUTTypeApplication) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationBundle) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationFile) ))
NSLog(@"Yes - File type is equal to Application");
Вот правильная реализация трансформатора:
@implementation icalValidTransformer
+ (Class)transformedValueClass { return [NSNumber class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
if (( value == nil ) || ( [[NSApp delegate]sharedWorkspace] == nil ))
return [NSNumber numberWithBool: NO];
NSError *fileError = nil;
NSString *fileType = [[[NSApp delegate] sharedWorkspace] typeOfFile:value error: &fileError];
if ( fileError != nil )
return [NSNumber numberWithBool: NO];
if (( UTTypeEqual((CFStringRef)fileType, kUTTypeApplication) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationBundle) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationFile) ))
return [NSNumber numberWithBool: YES];
return [NSNumber numberWithBool: NO];
}
@end
Это также очень хороший пример того, как использовать fileError с -typeOfFile - если есть ошибка (например, файл не существует), эта отключенная кнопка / меню / любой другой элемент управления, который вы использовали..