我对编程一般都很陌生 - 特别是对斯威夫特来说 - 但是最近有一件事我一直在喋喋不休。
我试图访问父母的变量'上课 - 但我无法解决如何到达那里。
我已经查看了其他似乎涵盖相同内容的帖子 - Access variable in different class - Swift,How to create a global variable?,Access variable in different class - Swift和Pass variables from one ViewController to another in Swift - 但似乎没有一个做我想做的事。
我希望能够设置一个偏好设置窗口,我可以设置该窗口并将其应用于我的主要'中的变量。 class - 但是我无法看到如何将变量从Preferences窗口传递到' main'类。
这是我在我的第一个ViewController上定义了NSTextField的示例,我希望能够在第二个ViewController中修改它并在第一个ViewController中进行更新。我的实际应用程序可能需要很多这样的实例,以便提供一整套可修改的首选项。
// ViewController.swift
import Cocoa
class ViewController: NSViewController {
lazy var sheet2ViewController: NSViewController = {
return self.storyboard!.instantiateControllerWithIdentifier("sheet2") as! NSViewController}()
@IBAction func openPanel(sender: AnyObject) {
displaySheet()
}
@IBOutlet weak var textField: NSTextField!
var textString : String = "" {
didSet {
textField.stringValue = textString
}
}
func displaySheet() {
self.presentViewControllerAsSheet(sheet2ViewController)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
// SecondViewController.swift
import Cocoa
class SecondViewController: NSViewController {
@IBOutlet weak var textField2: NSTextField!
@IBAction func closeButton(sender: AnyObject) {
???.textString = textField2.stringValue // How to address the ViewController variable here?
self.dismissController(self)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
}
如您所见,我遇到的问题是在SecondViewController类的closeButton函数中 - 如何将值传递回ViewController类中的textString变量?
我一直在看代表团和NSNotificationCenter - 但我真的不知道我是不是在这里咆哮着正确的树 - 感觉我将不得不实施这个(看似简单的)简单要求比我想象的要复杂得多。
非常欢迎任何建议 - 谢谢。
答案 0 :(得分:0)
在OSX故事板中NSViewController
有一个属性presentingViewController
,表示父视图控制器。
在SecondViewController
中,您可以参考演示控制器
let parentViewController = presentingViewController as! ViewController
答案 1 :(得分:0)
尝试使用委托和协议。创建子项时,将其委托设置为父项。其中一个委托方法可以有一个子进程可以设置的参数,父进程(或实现委托的类)可以读取。
一个小例子:
protocol MyProtocol {
func turnedOn(val:Bool) -> Void
}
class Headlights {
var delegate:MyProtocol?
func test1() -> Void {
if let del = delegate {
del.turnedOn(true)
}
}
}
class Car:MyProtocol {
var lamp:Headlights
init() {
lamp = Headlights()
lamp.delegate = self
}
func turnedOn(val:Bool) -> Void {
}
}