我有幾個可能需要幾秒鐘才能完成的程序,我想在我的主應用程式視窗中打開一個作業表,顯示一個不確定的 ProgressWheel 和一條訊息,說明該程序正在進行中。我希望該程序完成后關閉作業表。
我試圖通過對作業表執行 segue 并在我的 prepare(for segue) 中發送兩個字串值來實作這一點——一個 waitingMessage,因此作業表可以顯示正在進行的行程的名稱,以及一個 waitingState...那將是“開始”或“結束”。當我的作業表 ViewController 收到“開始”狀態時,它只會顯示 ProgressWheel 和訊息,而當它收到“結束”狀態時,它會自行關閉。
這是我正在嘗試的,但作業表不會關閉,即使它正在接收“結束”訊息 - 它只是顯示并且整個應用程式不會繼續。
import Cocoa
class WaitingViewController: NSViewController {
@IBOutlet weak var waitingProgressWheel: NSProgressIndicator!
@IBOutlet weak var waitingMessageLabel: NSTextField!
var waitingMessage : String = ""
var waitingState : String = ""
override var representedObject: Any? {
didSet {
let incomming = representedObject as! (String, String)
waitingMessage = incomming.0
waitingState = incomming.1
}
}
override func viewDidLoad() {
super.viewDidLoad()
waitingProgressWheel.startAnimation(self)
waitingMessageLabel.stringValue = waitingMessage
if waitingState == "ending" {
waitingProgressWheel.stopAnimation(self)
waitingMessageLabel.stringValue = "Done."
dismiss(self)
}
}
}
這是我準備的相關部分(用于segue)
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier == "waiting" {
var waitingInfo : (String, String) = ("","")
waitingInfo.0 = waitingSegueMessage
waitingInfo.1 = waitingSegueState
(segue.destinationController as! WaitingViewController).representedObject = waitingInfo
}
}
這是我更新的作業表視圖控制器:
import Cocoa
class WaitingViewController: NSViewController {
@IBOutlet weak var waitingProgressWheel: NSProgressIndicator!
@IBOutlet weak var waitingMessageLabel: NSTextField!
var processWaitingMessage : String = ""
var processWaitingState : ViewController.waitingState = .beginning
var isDone : Bool? {
didSet {
if isDone! {
dismiss(self)
}
}
}
override var representedObject: Any? {
didSet {
let incomming = representedObject as! (String, ViewController.waitingState)
processWaitingMessage = incomming.0
processWaitingState = incomming.1
if processWaitingState == .ending {
isDone = true
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
waitingProgressWheel.startAnimation(self)
waitingMessageLabel.stringValue = processWaitingMessage
if processWaitingState == .ending {
waitingProgressWheel.stopAnimation(self)
waitingMessageLabel.stringValue = "Done."
}
}
}
uj5u.com熱心網友回復:
你的方法是錯誤的。
您必須從呈現視圖控制器更新狀態。為了能夠做到這一點,你需要一個參考。
在ViewController添加屬性
weak var waitingSheet : WaitingViewController?
在WaitingViewController添加一個功能
func updateState(_ state: ViewController.waitingState) {
switch state {
case .beginning:
waitingProgressWheel.startAnimation(self)
waitingMessageLabel.stringValue = "Beginning"
case .ending:
waitingProgressWheel.stopAnimation(self)
waitingMessageLabel.stringValue = "Ending"
case .isDone:
dismiss(self)
}
}
viewDidLoad將狀態更新為beginning
override func viewDidLoad() {
super.viewDidLoad()
updateState(.beginning)
}
Back inViewController將作業表的參考分配給waitingSheetin prepareForSegue(representedObject不需要預定義的)
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier == "waiting" {
waitingSheet = segue.destinationController as? WaitingViewController
}
}
并從任何地方更新狀態ViewController
waitingSheet?.updateState(.ending)
和
waitingSheet?.updateState(.isDone)
nil在作業表被釋放后,weak 屬性將自身設定為
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463581.html
上一篇:(屬性)CommandInteractionOption<CacheType>.value?:string|號碼|布爾Discord.js斜線命令選項
