寫 iOS 和 macOS/OS X 的程式,有許多相同與不同的地方,相同的是程式語言,不同的是元件與資料來源/架構等。由於 iOS 是 sandBox 程式,只能抓取雲端檔案或照片等,但 macOS 是可以開啟一個本機檔案來修改撰寫,這時就需要一個檔案選取器了,但在元件選取器上搜尋了 "FilePicker" 沒有發現相關的資料,上網研究了一下,原來是要用 NSOpenPanel 這個物件來抓取檔案,記錄如下:
原則上,最簡單的設定方式,只要建立後啟動就可以了,以下是它的語法
NSOpenPanel().begin(completionHandler:(Int) -> Void)
語法上,我們看到一個 Colsur 用來處理完成後的事,所以只是要畫面的話,以下的 code 就可以了
NSOpenPanel().begin { (handler) in
print(handler)
}
而回傳的 handler 就是按下去的按鈕,預設的畫面如下
若最後按下的是 Cancel ,回傳就是 0,若是 Open 回就是 2
那選取的檔案在那兒?其實是會到物件本身的參數,所以我們要把物件寫成這樣:
let openPanel = NSOpenPanel()
openPanel.begin { (handler) in
print(handler)
if let selectedUrl = openPanel.url{
print(selectedUrl)
}
}
我們就可以取得路徑了,由於不一定會選檔案,也許會按取消,所以回傳的 URL 是一個 Optional。
基本上,這樣就可以用了,其他可常見的參數也有很多,:
let openPanel = NSOpenPanel()
openPanel.directoryURL = URL(fileURLWithPath: NSHomeDirectory())
//可設定或回傳開啟檔案的目錄位置, 若要開啟特定位置, 如個人的家目錄
openPanel.allowsMultipleSelection = false
// 是否可選取多檔,若是,url會回傳到 .urls[]
openPanel.canChooseDirectories = false
// 是否可選取【目錄】類型
openPanel.allowedFileTypes = ["txt","htm","html"]
// 限制選取的檔案類型,非這些檔案不得按下 Open
openPanel.begin { (handler) in
print(handler)
if let selectedUrl = openPanel.url{
print(selectedUrl)
}
}