所以我目前有一些代码来获取目录:
-(NSString *)get {
NSOpenPanel *gitDir = [NSOpenPanel openPanel];
NSInteger *ger = [gitDir runModalForTypes:nil];
NSString *Directory = [gitDir directory];
return Directory;
}
但它给了我错误,并说它现在已被折旧。
OSX 10.7还有更好的方法吗?
答案 0 :(得分:5)
每当您看到弃用警告时,您应该直接查看官方文档。在这种情况下,the docs for NSOpenPanel说:
runModalForTypes:显示面板并开始模态事件循环 当用户单击“确定”或“取消”时终止。 (在Mac OS X v10.6中不推荐使用。请改用runModal。您可以设置 使用setAllowedFileTypes的文件类型:。)
答案 1 :(得分:5)
这是sosborn答案的补充,而不是替代。
runModalForTypes:不推荐使用,正确的替换是runModal(或setAllowedFileTypes:后跟runModal,但在这种情况下,你传递的类型为nil。)
目录也已弃用,正确的替换是directoryURL。 (如果您实际上必须返回NSString路径而不是NSURL,只需返回[[gitDir directoryURL]路径]。)
但是,您正在做的是要求用户选择一个文件,然后返回该文件所在的目录,当您真正想要的是要求用户选择目录时。为此,您需要调用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];
}
答案 2 :(得分:2)
我通过abarnert为swift改编了代码。 tx代码就是我需要的。
func askUserForDirectory() -> NSURL? {
let myPanel:NSOpenPanel = NSOpenPanel()
myPanel.allowsMultipleSelection = false
myPanel.canChooseDirectories = true
myPanel.canChooseFiles = false
if ( myPanel.runModal() != NSFileHandlingPanelOKButton ) {
return nil
}
return myPanel.URLs[0] as? NSURL
}