NSOpenPanel / NSSavePanel

macOS Swift

NSOpenPanel / NSSavePanel

macOS Mojava 10.15.7 / Xcode 11.3.1 / Swift 5.0
NSOpenPanel/NSSavePanelクラスは、ユーザが Finder形式のディレクトリ一覧からファイルを選択し、任意の処理を行うという機能を一つのコントロールにより提供するものである。
主に、NSOpenPanelはファイルからデータを読み込む、NSSavePanelはデータをファイルに書き出すという処理で使われる。
パネルを閉じた後に起動するコールバック処理(Block文またはクロージャ)の中に、データ入出力等の処理を記述する。

NSOpePanelの例

オープンパネルからファイルを選択し、テキストファイルを読み込み、テキストビューに表示する。パネルはモーダルなシートとして開く。
[open_panel]
画像をクリックすると動画になります

オープンパネルの主な設定

directoryURL
最初に位置付けるディレクトリを URLオブジェクトにより指定する
canChooseFiles
ファイルの選択可否(省略値 true)
canChooseDirectories
ディレクトリの選択可否(省略値 false)
allowedFileTypes
選択可能なファイルタイプとしてファイルの拡張子を指定する。大文字小文字の区別はないので "txt" を指定したとき "TXT" も対象となる。
allowsMultipleSelection
複数ファイルの選択可否(省略値 false)
次のメソッドを使えば、パネルをモードレスなサブウィンドウとして開くこともできる。

NSSavePanelの例

テキストビューテキストをセーブパネルで選択されたファイルに出力する。出力先は、選択されたディレクトリ+ファイル名フィールドに入力されたファイル名となる。パネルはモーダルなシートとして開く。
ファイル名は、任意の名前を入力することも、パスの一覧からファイル名を選択することもできる。(なお、一覧に表示されるファイル名がグレーアウトするるのはなぜだろう。気に入らないのだが。)
出力しようとするファイルがすでに存在する場合は、警告ダイアログが表示される。これはセーブパネルに含まれる機能である。
[save_panel]
画像をクリックすると動画になります

セーブパネルの主な設定

directoryURL
最初に位置付けるディレクトリを URLオブジェクトにより指定する
nameFieldStringValue
ファイル名フィールドに最初に表示するファイル名
allowedFileTypes
出力ファイルに付与することが許される拡張子(ファイルタイプ)を指定する。指定のない拡張子を指定しても、強制的に指定の(複数の拡張子が定義されていたら最初の)拡張子が付与される。一方、この設定を行わなければ、あらゆるタイプの拡張子が使用できる。
canCreateDirectories
ディレクトリを作成することができる(省略値 true)
次のメソッドを使えば、パネルをモードレスなサブウィンドウとして開くこともできる。[ Swift ]

App Sandboxの設定について

App SandoboxをONにした場合は、File AccessのUser Selected Fileを “Read/Write” に設定すること。これは、パネルを通してユーザが指定するファイルは全て読み書き可能であることを意味する。”Read Only” だとOpenPanelのみ動作する。Noneだと、OpenPanel/SavePanelとも動作しない。
[sandbox]
App SandoboxをOFFにすれば、ファイルアクセスは自由なのでいずれも動作する。