2014-01-08 5 views
0

Пытаясь выяснить, если NSOpenPanel вернулся файл или режПроверка NSOpenPanel возвращает каталог

Я использовать пример код от компании Apple для fileExistsAtPath: и она отлично работает для шрифтов , но, кажется, не работает для openpanel не уверен, если я делаю правильную вещь с получением NSString из NSURL - Я все еще какао новичку

Это указывает на семантическую вопрос Отправка «константный BOOL *» (он же «Const подписал полукокса * ') к параметру типа «BOOL *» (он же «подписанный символ *») отбрасывает квалификаторы

Любая помощь, пожалуйста,

- (IBAction)openImage: (id)sender 
{ 
    // present open panel... 

NSString * extensions = @"tiff/tif/TIFF/TIF/jpg/jpeg/JPG/JPEG/CR2"; 
NSArray *  types = [extensions pathComponents]; 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 

//=================================== 
// example just to see if it works!! 
NSArray *subpaths; 
BOOL isDir; 
NSArray *paths = NSSearchPathForDirectoriesInDomains 
(NSLibraryDirectory, NSUserDomainMask, YES); 
if ([paths count] == 1) { 
    NSString *fontPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Fonts"]; 
    if ([fileManager fileExistsAtPath:fontPath isDirectory:&isDir] && isDir) { 
     NSLog(@"======= fontPath = %@", fontPath);   
    } 
} 
//============================================ 

// Let the user choose an output file, then start the process of writing samples 
NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setAllowedFileTypes:types]; 
[openPanel setCanSelectHiddenExtension:YES]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel beginSheetModalForWindow:_window completionHandler:^(NSInteger result) { 
    if (result == NSFileHandlingPanelOKButton) 
    { 
      // user did select an image... 

     NSLog(@"URL = %@",[openPanel URL]); 
     NSString *workFile = [[openPanel URL] absoluteString]; 
     NSLog(@"workFile %@",workFile); 
     if ([fileManager fileExistsAtPath:workFile isDirectory:&isDir] && isDir) { 
      NSLog(@"======== It's a dir======="); 
     } 


     [self openImageURL: [openPanel URL]]; 
     } 
    }]; 
} 
+0

fileExistsAtPath всегда будет проверять наличие файла или нет. Таким образом, вы можете поставить условие else здесь, если fileExistsAtPath возвращает true, а затем распечатать его файл или иначе, в противном случае условие print - это каталог. –

ответ

1

Когда блок ссылается на локальный (стек) переменной, объявленной вне самого блока, то:

  • постоянной одного и того же типа и именем локальной переменной добавляется к блоку ; и

  • ток значение этой локальной переменной используется в качестве значения блока постоянной

Вот почему вы получите ошибку со ссылкой на const BOOL как вы пытаетесь передать адрес постоянная блока isDir, где ожидается адрес непостоянства.

Вы можете передать isDir к блоку как переменная, используя __block классификатор на его декларацию, что означает, что использование isDir внутри блока относится к точно такой же переменной как заявленные вне блока.

Однако из ваших комментариев это не похоже на то, что вам нужно, скорее, вы просто хотите, чтобы переменная, локальная для блока, использовалась в вызове метода и if. Для этого просто объявите переменную внутри блока. Вы уже объявляете NSString *workFile внутри блока, просто объявляйте локальное логическое значение таким же образом.

HTH

0

The __block Storage Type См. Вы передаете ссылку на isDir на fileExistsAtPath:isDirectory:, которая изменяет переменную isDir, а переменная isDir копируется блоком, который вы передаете как completionHandler.

The __block Storage Type От:

Вы можете указать, что импортировано переменный быть изменяемыми-то есть чтения от записи с помощью применения модификатора __block типа хранения.

+0

Спасибо, я вижу, проблема заключается в том, что есть блок. Прочитали некоторую документацию по блокам, не могу сказать, что я полностью понимаю концепцию - это моя первая реальная попытка в Cocoa:} Я пробовал объявить __block BOOL isDir; в разных местах, но безрезультатно. Как я на самом деле это делаю? Я просто хочу отобразить NSOpenPanel Если пользователь выбирает файл, тогда откройте его. Если они выбирают каталог, то сделайте что-нибудь еще. Ta – user1321964

0

Думаю, я понимаю это сейчас, спасибо всем. Также предположил, что fileExistsAtPath требует путь к файлу, поэтому URL-адрес должен быть преобразован с помощью myUrl.путь

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setAllowedFileTypes:types]; 
[openPanel setCanSelectHiddenExtension:YES]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel beginSheetModalForWindow:_window completionHandler:^(NSInteger result) { 
    if (result == NSFileHandlingPanelOKButton) 
    { 
      // user did select an image... 
      // get list of files in this dir 

     NSURL *myUrl = [openPanel URL]; 
     NSString *workFile = myUrl.path; 
     NSLog(@"workFile %@",workFile); 
     BOOL isDir; 
     if ([fileManager fileExistsAtPath:workFile isDirectory:&isDir] && isDir) { 
      NSLog(@"---------It's a dir---"); 

     } 

    } 
}]; 
Смежные вопросы