我正在嘗試在 NSAlerts 的 UtilityController 類中撰寫一個方法,但該方法未顯示警報。我從 ViewController 中的 viewDidAppear() 方法呼叫它,所以我認為這會起作用,因為視圖已經在螢屏上。對?
我從 viewDidAppear() 方法呼叫它的原因是因為在我的實際應用程式中,我最初從 CoreData 加載資料,該資料在程式啟動時從 viewDidAppear() 方法呼叫,并將該資料與磁盤上的資料檔案進行比較。如果在比較期間加載時檢測到不一致,我想給用戶一個選項來繼續加載更改的資料,或者退出應用程式并修復需要修復的內容。
import Cocoa
class ViewController: NSViewController {
let utility = UtilityController()
let dataController = DataController() // <-- EDIT
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear() {
super.viewDidAppear() // <-- EDIT
dataController.fetchData() // <-- EDIT
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
import Cocoa
class UtilityController: NSObject {
func showAlert() {
let alert = NSAlert()
// Create an alert notification based upon what was discovered.
alert.messageText = "Warning: This is an alert!"
alert.informativeText = "Something informative will be here!"
alert.addButton(withTitle: "Continue")
alert.addButton(withTitle: "Exit")
if let mainViewWindow = NSApplication.shared.keyWindow?.contentViewController?.view.window {
alert.beginSheetModal(for: mainViewWindow) { (returnCode: NSApplication.ModalResponse) -> Void in
// Continue = 1000
// Exit = 1001
alert.window.close()
switch returnCode.rawValue {
case 1001: // Exit
exit(0)
default: // Continue
return
}
}
}
}
}
編輯:我添加了這門課,我在原帖中省略了
import Cocoa
class DataController: NSObject {
// This is the controller class that performs CoreData CRUD
let utility = UtilityController()
func fetchData() {
// do the CoreData fetch of the data and if an error is found
utility.showAlert()
}
}
uj5u.com熱心網友回復:
NSViewController擴展并制作showAlert它的實體方法會容易得多。這樣您就可以訪問view.window呼叫此方法的視圖控制器的視圖控制器屬性。super注意覆寫viewDidAppear方法時不要忘記呼叫。請注意,如果您構建和運行您的應用程式(這只是從 Xcode 運行您的應用程式的問題),您的方法應該有效,但請注意,如果您的應用程式在執行該代碼時未處于活動狀態,您的方法可能會失敗。使用視圖控制器的view.window屬性更安全:
extension NSViewController {
func showAlert() {
let alert = NSAlert()
alert.messageText = "Warning: This is an alert!"
alert.informativeText = "Something informative will be here!"
alert.addButton(withTitle: "Continue")
alert.addButton(withTitle: "Exit")
if let window = view.window {
alert.beginSheetModal(for: window) { modalResponse in
alert.window.close()
switch modalResponse.rawValue {
case 1001: // Exit
exit(0)
default: // Continue
return
}
}
}
}
}
用法:
class ViewController: NSViewController {
override func viewDidAppear() {
super.viewDidAppear()
showAlert()
}
}
編輯/更新:
如果您不想擴展 NSViewController 最安全的方法是在呼叫您的方法時傳遞視窗:
class ViewController: NSViewController {
let utility = UtilityController()
let dataController = DataController()
override func viewDidAppear() {
super.viewDidAppear()
dataController.fetchData(view.window)
}
}
class UtilityController: NSObject {
func showAlert(_ sender: NSWindow?) {
guard let sender = sender else { return }
let alert = NSAlert()
alert.messageText = "Warning: This is an alert!"
alert.informativeText = "Something informative will be here!"
alert.addButton(withTitle: "Continue")
alert.addButton(withTitle: "Exit")
alert.beginSheetModal(for: sender) { modalResponse in
alert.window.close()
switch modalResponse.rawValue {
case 1001:
exit(0)
default:
return
}
}
}
}
import Cocoa
class DataController: NSObject {
let utility = UtilityController()
func fetchData(_ sender: NSWindow?) {
utility.showAlert(sender)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415453.html
標籤:
