访问父母的变量或功能'类

时间:2016-05-03 08:35:31

标签: swift macos

我对编程一般都很陌生 - 特别是对斯威夫特来说 - 但是最近有一件事我一直在喋喋不休。

我试图访问父母的变量'上课 - 但我无法解决如何到达那里。

我已经查看了其他似乎涵盖相同内容的帖子 - Access variable in different class - SwiftHow to create a global variable?Access variable in different class - SwiftPass 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 - 但我真的不知道我是不是在这里咆哮着正确的树 - 感觉我将不得不实施这个(看似简单的)简单要求比我想象的要复杂得多。

非常欢迎任何建议 - 谢谢。

2 个答案:

答案 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 {

    }
}