检查NSOpenPanel是否返回目录

时间:2014-01-08 15:16:35

标签: cocoa

尝试确定NSOpenPanel是否已返回文件或目录

我已经将Apple的示例代码用于fileExistsAtPath:并且它适用于fontPath 但似乎不适用于openpanel 不确定我从NSURL获取NSString是否正确 - 我仍然是Cocoa新手

它确实表明存在语义问题  将'const BOOL *'(又名'const signed char *')发送到'BOOL *'类型的参数(又名'signed char *')会丢弃限定符

请帮助

- (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]];
        }
    }];
}

3 个答案:

答案 0 :(得分:1)

当一个块引用在块本身之外声明的本地(堆栈)变量时,然后:

  • 将与局部变量相同类型和名称的常量添加到块中;以及

  • 该局部变量的当前用作块常量的值

这就是为什么当你试图传递块的常量const BOOL的地址时,你会得到一个引用isDir的错误的原因,其中非常数的地址是预期的。

您可以使用isDir限定符在其声明中将__block作为变量传递给块,这意味着在块中使用isDir引用与在块外声明的变量完全相同的变量

但是,根据您的评论,这似乎并不是您所需要的,而只是您希望块的本地变量在方法调用和if语句中使用。为此,只需在块中声明一个变量。您已经在块中声明NSString *workFile,只需以相同的方式声明本地布尔值。

HTH

答案 1 :(得分:0)

The __block Storage Type。您正在将isDir的引用传递给fileExistsAtPath:isDirectory:,它正在修改isDir变量,并且isDir变量由您传递的块{{1}复制}}。

来自The __block Storage Type

  

您可以指定导入的变量是可变的 - 即   read-write-通过应用__block存储类型修饰符。

答案 2 :(得分:0)

想想我现在明白了,谢谢大家。还认为fileExistsAtPath需要一个文件路径,因此必须使用myUrl.path转换URL

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---");

        }

    }
}];