OSX で Swift でファイルを開く、保存するダイアログを表示したかったので調べてみました。
NSOpenPanel でファイルを開く
NSOpenPanel を使ってダイアログを表示します。プロパティでどんなファイルが選択可能か設定できます。
let openPanel = NSOpenPanel()
openPanel.allowsMultipleSelection = false // 複数ファイルの選択を許すか
openPanel.canChooseDirectories = false // ディレクトリを選択できるか
openPanel.canCreateDirectories = false // ディレクトリを作成できるか
openPanel.canChooseFiles = true // ファイルを選択できるか
openPanel.allowedFileTypes = NSImage.imageTypes() // 選択できるファイル種別
openPanel.beginWithCompletionHandler { (result) -> Void in
if result == NSFileHandlingPanelOKButton { // ファイルを選択したか(OKを押したか)
guard let url = openPanel.URL else { return }
log.info(url.absoluteString)
// ここでファイルを読み込む
}
}
NSSavePanel でファイルを保存する
NSSavePanel を使ってダイアログを表示します。
let savePanel = NSSavePanel()
savePanel.canCreateDirectories = true
savePanel.showsTagField = false
savePanel.nameFieldStringValue = "\(pj.name).zip"
savePanel.beginWithCompletionHandler { (result) in
if result == NSFileHandlingPanelOKButton {
guard let url = savePanel.URL else { return }
log.info(url.absoluteString)
// ここでファイルに書き込む
}
}
保存しようとした先にファイルがすでに存在している場合は「上書きしますか?」という確認も自動で表示してくれますが、ファイルを書き込む際は自分で既存のファイルを削除する必要があります。
おまけ:ドラッグ&ドロップでファイルを開く
ドラッグ&ドロップでファイルを開きたい時は自分でクラスを作って、registerForDraggedTypes を呼び出しておく必要があります。ドロップされた時にperformDragOperationが呼ばれるのでここでファイルに関する処理を行います。
import Cocoa
class DraggableImageView: NSImageView {
required init?(coder: NSCoder) {
super.init(coder: coder)
registerForDraggedTypes(NSImage.imageTypes())
}
override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
return NSDragOperation.Copy
}
override func performDragOperation(sender: NSDraggingInfo) -> Bool {
// 画像をドラッグ&ドロップで読み込む例
if let image = NSImage(pasteboard: sender.draggingPasteboard()) {
// ここで画像の処理を行う
return true
}
return false
}
}