Objective-C目录选择器(OSX 10.7)

1 macos file objective-c

所以我目前有一些代码来获取一个目录:

-(NSString *)get {      
  NSOpenPanel *gitDir = [NSOpenPanel openPanel];
  NSInteger *ger = [gitDir runModalForTypes:nil];
  NSString *Directory = [gitDir directory];
  return Directory;
}
Run Code Online (Sandbox Code Playgroud)

但它给了我错误,并说它现在已经折旧了.

OSX 10.7有更好的方法吗?

sos*_*orn 5

每当您看到弃用警告时,您应该直接阅读官方文档.在这种情况下,NSOpenPanel的文档说:

runModalForTypes:显示面板并开始一个模态事件循环,当用户单击"确定"或"取消"时,该循环将终止.(在Mac OS X v10.6中不推荐使用.改为使用runModal.您可以使用setAllowedFileTypes:设置fileTypes.)


aba*_*ert 5

这是sosborn答案的补充,而不是替代品.

runModalForTypes:不推荐使用,正确的替换是runModal(或setAllowedFileTypes:后跟runModal,但在这种情况下,你为类型传递nil).

目录也已弃用,正确的替换是directoryURL.(如果您实际上必须返回NSString路径而不是NSURL,只需返回[[gitDir directoryURL] path].)

但是,您正在做的是要求用户选择一个文件,然后返回该文件所在的目录,当您真正想要的是要求用户选择一个目录时.为此,您需要调用setCanChooseFiles:NO和setCanChooseDirectories:YES,然后调用URL以获取用户选择的目录.

此外,您忽略了runModal(或runModalForTypes :)的结果.我确定编译器会警告你未使用的变量"ger",你不应该忽略警告.如果用户取消该面板,您将把它视为单击"确定",并选择她取消时遇到的任何目录.

这是一个更好的实现,它将返回所选目录的URL,如果用户取消(或以某种方式设法不选择任何内容),则返回nil.同样,如果您需要NSString,只需在return语句中添加"path"调用:

-(NSURL *)get {      
   NSOpenPanel *panel = [NSOpenPanel openPanel];
   [panel setAllowsMultipleSelection:NO];
   [panel setCanChooseDirectories:YES];
   [panel setCanChooseFiles:NO];
   if ([panel runModal] != NSFileHandlingPanelOKButton) return nil;
   return [[panel URLs] lastObject];
}
Run Code Online (Sandbox Code Playgroud)