返回

OS开发秘籍十三:在Mac上存取文件

IOS

一、需求来源

在Mac开发中,选择和保存文件是一个常见需求。例如,用户需要选择一张图片并将其保存在应用程序的本地文件夹中,或者需要将应用程序生成的数据保存到用户选择的位置。

二、保存文件示例

//创建一个保存文件面板
let savePanel = NSSavePanel()
savePanel.allowedFileTypes = ["public.text"] //设置允许保存的文件类型
savePanel.canCreateDirectories = true //允许创建目录
savePanel.nameFieldLabel = "文件名:" //设置名称字段标签
savePanel.message = "选择要保存的位置" //设置消息
savePanel.prompt = "保存" //设置提示按钮标题

//显示保存文件面板
let result = savePanel.runModal()
if result == .OK {
    //获取保存的文件路径
    let filePath = savePanel.url!.path
    
    //将数据保存到文件中
    do {
        try data.write(toFile: filePath, options: .atomic)
        print("文件已保存")
    } catch {
        print("文件保存失败: \(error)")
    }
}

三、选择文件示例

//创建一个选择文件面板
let openPanel = NSOpenPanel()
openPanel.allowedFileTypes = ["public.text"] //设置允许选择的文件类型
openPanel.canChooseDirectories = true //允许选择目录
openPanel.canChooseFiles = true //允许选择文件
openPanel.allowsMultipleSelection = true //允许多选
openPanel.title = "选择文件" //设置面板标题
openPanel.message = "选择要打开的文件或目录" //设置消息
openPanel.prompt = "打开" //设置提示按钮标题

//显示选择文件面板
let result = openPanel.runModal()
if result == .OK {
    //获取选择的文件路径
    let filePaths = openPanel.urls.map { $0.path }
    
    //处理选择的文件
    for filePath in filePaths {
        print("已选择文件: \(filePath)")
    }
}

四、NSPanelStudyController

NSPanelStudyController提供了一个简单的方式来显示保存和打开文件面板。它处理了面板的显示、隐藏和关闭,以及用户交互。

//创建一个NSPanelStudyController实例
let panelController = NSPanelStudyController()

//设置保存文件面板
let savePanel = NSSavePanel()
savePanel.allowedFileTypes = ["public.text"]
savePanel.canCreateDirectories = true
savePanel.nameFieldLabel = "文件名:"
savePanel.message = "选择要保存的位置"
savePanel.prompt = "保存"

//设置选择文件面板
let openPanel = NSOpenPanel()
openPanel.allowedFileTypes = ["public.text"]
openPanel.canChooseDirectories = true
openPanel.canChooseFiles = true
openPanel.allowsMultipleSelection = true
openPanel.title = "选择文件"
openPanel.message = "选择要打开的文件或目录"
openPanel.prompt = "打开"

//将面板添加到NSPanelStudyController实例
panelController.add(savePanel)
panelController.add(openPanel)

//显示面板
panelController.begin()