尝试确定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]];
}
}];
}
答案 0 :(得分:1)
当一个块引用在块本身之外声明的本地(堆栈)变量时,然后:
将与局部变量相同类型和名称的常量添加到块中;以及
该局部变量的当前值用作块常量的值
这就是为什么当你试图传递块的常量const BOOL
的地址时,你会得到一个引用isDir
的错误的原因,其中非常数的地址是预期的。
您可以使用isDir
限定符在其声明中将__block
作为变量传递给块,这意味着在块中使用isDir
引用与在块外声明的变量完全相同的变量。
但是,根据您的评论,这似乎并不是您所需要的,而只是您希望块的本地变量在方法调用和if
语句中使用。为此,只需在块中声明一个变量。您已经在块中声明NSString *workFile
,只需以相同的方式声明本地布尔值。
HTH
答案 1 :(得分:0)
见The __block Storage Type。您正在将isDir
的引用传递给fileExistsAtPath:isDirectory:
,它正在修改isDir
变量,并且isDir
变量由您传递的块{{1}复制}}。
您可以指定导入的变量是可变的 - 即 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---");
}
}
}];