ios - 如何从另一个视图控制器中的变量中获取值
问题描述
我试图从 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, maxRange: maxNumber, isTriesEnabled: triesEnabled, 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)
}
}
首选项视图显示为一张表(我不知道这是否重要)
解决方案
当您使用时,instantiateController
您正在创建一个新的、从未使用过的控制器实例。如果您想使用通知传输数据,请self
在调用时作为对象发送post
,然后使用它来获取变量。
您还需要进行更改applyPrefs
,使其采用 Notification 参数,以便您可以使用通知对象。
推荐阅读
- python - 试图将字符串与字典的内容进行比较
- pycharm - PyCharm中的传统箭头键有什么快捷方式吗
- java - 如何将字符串和变量连接到 th:src
- python - 使用过滤器数组在母数组中查找值索引
- ios - 如何使用与 NewtonSoft (JSON.Net) 组件中的 JSON 匹配的 Swift 类从/向 JSON 读取/写入对象数组?
- x86 - 当堆栈指针未填充 16 位时,libc 的 system() 会导致分段错误
- php - 使包含的文件具有其相对目录位置,而不是调用它的目录位置
- android - 为什么有时在其中使用 webview 时警报对话框会闪烁
- c# - PartialViewResult 表单不会清除 ajax 结果上的值 - ASP.NET Core Razor c#
- python - 如何在绝对导入中设置没有点符号的 Pypi 包 - python3