2015-09-03 8 views
2

Я создаю песочницу OS X app (OS X 10.10.5, Xcode 6.4). В ходе выполнения я открываю объект NSOpenPanel. Тогда я бегу следующий фрагмент кода:NSOpenPanel в песочнице app игнорирует предоставленный каталог URL

NSString* s=[@"~" stringByExpandingTildeInPath]; 
NSOpenPanel* panel = [NSOpenPanel openPanel]; 
[panel setCanChooseDirectories:YES]; 
[panel setCanChooseFiles:NO]; 
NSURL* url=[NSURL fileURLWithPath:s]; 
if(url){ 
    [panel setDirectoryURL:url]; 
} 
[panel setAllowsMultipleSelection:YES]; 
[panel beginSheetModalForWindow:[self.outlineView window]completionHandler:^(NSInteger result) {} 

Я ожидаю, что панель открывается в каталоге /Users/xxx/Library/Containers/com.123456.App/

Вместо что панель открывается в каталоге /Пользователи/ххх

Применение фактически построен и развернут в каталог /Users/xxx/Library/Containers/com.123456.App/Data/

При отладке я замечаю, что на данный момент:

if(url){ 
    [panel setDirectoryURL:url]; 
} 

URL-адрес содержит правильное значение: файл: ///Users/xxx/Library/Containers/com.123456.App/Data/

Любая идея?

ответ

1

Есть ли причина, по которой вы хотите использовать NSOpenPanel в контейнере приложения? Контейнер предназначен для внутренних файлов данных/поддержки приложения (к которым пользователям обычно не нужно обращаться). NSOpenPanel/NSSavePanel используются для того, чтобы пользователь мог выбрать файл/каталог из своих собственных документов, которые не были бы расположены в контейнере.

Также рассмотрите возможность использования NSFileManagerURLsForDirectory:inDomains:, чтобы получить NSURL по желаемому пути.

+0

Да, у меня есть причина и согласно рекомендациям Apple Я ДОЛЖЕН использовать NSOpenPanel, если я хочу просматривать каталоги – Boris

+0

Правильно, но использование NSOpenPanel для просмотра контейнера вашего приложения не имеет смысла. Пользовательские данные не должны храниться в контейнере, а только внутренние файлы вашего приложения, к которым пользователь не должен обращаться напрямую. Независимо от того, существует ли какая-либо разница, если вы используете 'NSURL * url = [NSURL fileURLWithPath: NSHomeDirectory()];' –

+2

@Boris - вам нужно использовать только 'NSOpenPanel', чтобы пользователь предоставил вам доступ к файлам, которые ваше приложение еще не делает иметь доступ к. Доступ к файлам в вашем контейнере можно получить напрямую, и вы можете найти содержимое каталога, используя обычные API. – CRD