#27 Swift — macOS 跳出 NSAlert 視窗

Stephen Huang
彼得潘的 Swift iOS App 開發教室
4 min readDec 2, 2022

--

創造一個 macOS 專案,Xcode會import Cocoa,

而非平常熟悉的UIKit

在這個Cocoa裡面,他的警告視窗是NSAlert

一、那如何呼叫NSAlert呢

 let alertController = NSAlert()
// 設置警告圖案
alertController.icon = NSImage(systemSymbolName: "exclamationmark.triangle", accessibilityDescription: nil)
// 增加按鈕
alertController.addButton(withTitle: "確定")
// 警告的訊息
alertController.messageText = "*輸入框請勿空白。"
// 執行
alertController.runModal()
NSAlert-1

二、在使用者點擊按鈕後進行動作

要在警告視窗點擊後加入動作,需要「beginSheetModal」,會回傳一個ModalResponse型別。

let alertController = NSAlert()
// 和(一)的步驟一樣
alertController.icon = NSImage(systemSymbolName: "checkmark", accessibilityDescription: nil)
// 兩個按鈕會從右至左排列,右邊的是藍色
alertController.addButton(withTitle: "確定")
// 左邊的沒有顏色
alertController.addButton(withTitle: "取消")
alertController.messageText = "視窗訊息"
alertController.beginSheetModal(for: window) { response in
switch response.rawValue {
// 第一個按鈕的raw值是1000
case 1000: print("確定")
// 依序下去
case 1001: print("取消")
default: print("其他")
}
}
NSAlert-2

如果繼續增加按鈕,會變成上下排列的方式。

三、也可以轉換成用 mac 的錯誤圖示

        guard let window = view.window else { return }
// 黃色的警告圖示
let userInfo = [NSLocalizedDescriptionKey: "警告類型"]
let error = NSError(domain: NSOSStatusErrorDomain, code: 0, userInfo: userInfo)
// 加入生成的 NSError
let alertController = NSAlert(error: error)

alertController.icon = NSImage(size: NSSize(width: 1, height: 1))
alertController.addButton(withTitle: "確定")
alertController.addButton(withTitle: "取消")
alertController.addButton(withTitle: "選項3")
alertController.messageText = "視窗訊息"
alertController.beginSheetModal(for: window) { response in
switch response.rawValue {
case 1000: print("確定")
case 1001: print("取消")
case 1002: print("選項3")
default: print("其他")
}
}
NSAlert-3

--

--