问题描述
我试图从ViewController的PrefsViewController中的4个不同变量中获取值,但是当关闭PrefsViewController时,值会重置。
ViewController.swift的片段
class ViewController: NSViewController,NSWindowDelegate {
var triesEnabled = false
var minNumber = 0
var maxnumber = 20
var maxTries = 3
@objc func applyPrefs() {
let mainSB = nsstoryboard(name: "Main",bundle: nil)
let prefsVC: PrefsViewController = mainSB.instantiateController(withIdentifier: "prefsViewController") as! PrefsViewController
minNumber = prefsVC.prefsMinNum
maxnumber = prefsVC.prefsMaxnum
triesEnabled = prefsVC.prefsTriesEnabled
maxTries = prefsVC.prefsMaxTries
print("\(minNumber) \(maxnumber) \(triesEnabled) \(maxTries)") // here I can see that it has been reset to the default values
resetGame(minRange: minNumber,maxrange: maxnumber,isTriesEnabled: triesEnabled,triesLimit: maxTries)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addobserver(self,selector: #selector(applyPrefs),name: Notification.Name("notifyApplyPrefs"),object: nil )
resetGame(minRange: minNumber,triesLimit: maxTries)
}
}
PrefsViewController的片段
class PrefsViewController: NSViewController {
var triesOn = false
var prefsMinNum: Int = 0
var prefsMaxnum: Int = 20
var prefsTriesEnabled: Bool = false
var prefsMaxTries: Int = 3
@IBAction func closeButton(_ sender: Any) {
if (!minNumTextField.stringValue.isInt || !maxnumTextField.stringValue.isInt || !triesTextField.stringValue.isInt) {
let alert = NSAlert()
alert.messageText = "Error"
alert.informativeText = "You can only enter (whole) numbers in the text fields."
alert.alertStyle = .warning
alert.addButton(withTitle: "OK")
alert.runModal()
return
}
prefsMinNum = Int(minNumTextField.intValue)
prefsMaxnum = Int(maxnumTextField.intValue)
prefsTriesEnabled = triesOn
prefsMaxTries = Int(minNumTextField.intValue)
print("minNumTextField: \(prefsMinNum) maxnumTextField: \(prefsMaxnum) triesCheckBox: \(prefsTriesEnabled) triesTextField: \(prefsMaxTries)")
NotificationCenter.default.post(name: Notification.Name("notifyApplyPrefs"),object: nil)
self.dismiss(self)
}
}
prefs视图显示为一张纸(我不知道这是否重要)
解决方法
使用instantiateController
时,您将创建一个从未使用过的新控制器实例。如果要使用通知传输数据,请在调用self
时将post
作为对象发送,然后使用它来获取变量。
您还需要更改applyPrefs
,使其带有Notification参数,以便您可以使用通知对象。