以编程方式关闭工作表



我有几个进程可能需要几秒钟才能完成,我想在我的主应用程序窗口中打开一个工作表,显示一个不确定的ProgressWheel和一条消息,说进程正在进行中。我想在流程完成时关闭工作表。

我试图通过执行一个segue到表和发送它两个字符串值在我的准备(为segue) -一个waitingMessage,所以表可以显示正在进行的进程的名称,和一个waitingState…这可能是"开始";或";ending"。当我的视图控制器接收到& starting"状态时,它会显示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 incoming = representedObject as! (String, String)
waitingMessage = incoming.0
waitingState = incoming.1
}
}

override func viewDidLoad() {
super.viewDidLoad()
waitingProgressWheel.startAnimation(self)
waitingMessageLabel.stringValue = waitingMessage
if waitingState == "ending" {
waitingProgressWheel.stopAnimation(self)
waitingMessageLabel.stringValue = "Done."
dismiss(self)
}
}
}

这是我的prepare(for 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 incoming = representedObject as! (String, ViewController.waitingState)
processWaitingMessage = incoming.0
processWaitingState = incoming.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."
}
}
}

你的方法是错误的。

你必须从呈现视图控制器更新状态。要做到这一点,你需要一个参考。

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)
}

回到ViewController,将对表的引用赋值给prepareForSegue中的waitingSheet(不需要预定义的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)

在表被释放后,weak属性将自己设置为nil

相关内容

最新更新