Выбор приложения - Какао - PullRequest
3 голосов
/ 11 июля 2011

Я хочу отобразить диалоговое окно, которое позволяет пользователю просматривать свои текущие приложения (/ Applications), и мне нужно получить полный путь к этому приложению (выбранный).Как бы я пошел по этому поводу?Примеры кода приветствуются.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Примерно так будет хорошим началом:

NSArray *appsDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, 
                       NSLocalDomainMask,  YES);
NSString *appsDir = nil;
if ([appsDirs count]) appsDir = [appsDirs objectAtIndex:0];

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setTitle:NSLocalizedString(@"Add Application", @"")];
[openPanel setMessage:NSLocalizedString(@"Choose the application to add.", @"")];
[openPanel setPrompt:NSLocalizedString(@"Add Application", @"")];
[openPanel setAllowsMultipleSelection:YES]; // ?
[openPanel setCanChooseDirectories:NO];
[openPanel setDelegate:self];

NSInteger result = [openPanel runModalForDirectory:appsDir
                                              file:nil
                                             types:
                    [NSArray arrayWithObject:NSFileTypeForHFSTypeCode('APPL')]];

if (result == NSOKButton) {
    NSArray *fileURLs = [openPanel URLs];
    for (NSURL *URL in fileURLs) {
         NSString *path = [URL path];
         // add path, etc.
    }
}
1 голос
/ 11 июля 2011

См. Руководство Apple по управлению файлами приложений , в котором показано, как использовать класс NSOpenPanel.

0 голосов
/ 12 июля 2011

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

Еще один вариант, если вы знаете тип файла, для которого вы хотите найти подходящие приложения, - это использовать одну из следующих функций Launch Services:

  • LSCopyApplicationURLsForURL(), который возвращает список приложений, которые могут открывать определенный URL
  • LSCopyAllHandlersForURLScheme(), который возвращает список приложений, которые могут открывать определенную схему URL (например, http)
  • LSCopyAllRoleHandlersForContentType(), который возвращает список приложений, которые обрабатывают определенный тип контента

Кроме того, вы можете использовать Spotlight, чтобы найти все приложения в вашей системе и отобразить диалоговое окно, в котором вы можете выбрать из них.

Однако имейте в виду, что по умолчанию это вернет лот приложений, включая вспомогательные приложения (в моей системе это возвращает 1628 результатов), поэтому вам нужно быть осторожным при создании предиката поиска и ограничить поиск только папками «Приложения» и исключить файлы внутри пакетов и системных расположений.

Ниже приведен код, который найдет все приложения в системе. Вам нужно будет изменить предикат для собственного использования.

#import <Cocoa/Cocoa.h>
@interface Search : NSObject
{
    NSMetaDataQuery* query;
}
@end


@implementation Search
-(id) init
{
    self = [super init];
    if(self)
    {
        query=[[NSMetadataQuery alloc] init];
        [query setPredicate:[NSPredicate predicateWithFormat:@"kMDItemKind == \"Application\""]];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedSearchForApplications:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
        [query startQuery];
    }
    return self;
}

-(void) finishedSearchForApplications:(NSNotification*) notification
{
    //get the number of items in the results
    NSUInteger resultCount = [[query results] count];
    NSMutableArray* appsFound = [NSMutableArray array];

    //loop through the results and add their paths to an array
    NSUInteger i;
    for(i=0;i<resultCount;i++)
    {
        id queryResult=[query resultAtIndex:i];
        NSString* pathOfItem = [[[[queryResult valueForKey:@"kMDItemPath"] stringByStandardizingPath] stringByAbbreviatingWithTildeInPath] stringByDeletingPathExtension];
        NSDictionary* fileInfo = [NSDictionary dictionaryWithObject:pathOfItem forKey:@"path"];
        [appsFound addObject:fileInfo];
    }
    NSLog(@"%ld apps found: %@",resultCount,appsFound);
    //do something with appsFound
}

- (void)dealloc
{
    [query release];
    [super dealloc];
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...