Swift 在'中访问变量或函数;家长';班

Swift 在'中访问变量或函数;家长';班,swift,macos,Swift,Macos,总的来说,我对编程相当陌生——特别是对Swift——但最近有一件事我一直在绞尽脑汁 我试图访问“parent”类中的一个变量,但我不知道如何访问它 我已经看过了其他的帖子,它们似乎都涵盖了同样的内容-,和-,但它们似乎都不是我想要的 我希望能够有一个首选项设置窗口,我可以设置并应用到我的“main”类中的变量,但我看不到如何将变量从首选项窗口传递到“main”类 下面是一个示例,我在第一个ViewController上定义了一个NSTextField,我希望能够在第二个ViewControlle

总的来说,我对编程相当陌生——特别是对Swift——但最近有一件事我一直在绞尽脑汁

我试图访问“parent”类中的一个变量,但我不知道如何访问它

我已经看过了其他的帖子,它们似乎都涵盖了同样的内容-,和-,但它们似乎都不是我想要的

我希望能够有一个首选项设置窗口,我可以设置并应用到我的“main”类中的变量,但我看不到如何将变量从首选项窗口传递到“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变量

我一直在关注delegation和NSNotificationCenter——但我真的不知道我是否在这里找到了正确的答案——感觉我将不得不实现比我预期的(看似)简单需求更复杂的东西


欢迎提供任何建议-谢谢。

在OSX故事板中,NSViewController具有表示父视图控制器的属性
presentingViewController

SecondViewController
中,您可以使用

let parentViewController = presentingViewController as! ViewController

在OSX序列图像板中,NSViewController有一个表示父视图控制器的属性

SecondViewController
中,您可以使用

let parentViewController = presentingViewController as! ViewController

尝试使用委托和协议。创建子对象时,将其委托设置为父对象。其中一个委托方法可以具有子级可以设置的参数,父级(或实现委托的类)可以读取该参数

一个小例子:

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 {

    }
}

尝试使用委托和协议。创建子对象时,将其委托设置为父对象。其中一个委托方法可以具有子级可以设置的参数,父级(或实现委托的类)可以读取该参数

一个小例子:

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 {

    }
}

谢谢Vadian-但是当我尝试此操作时,我得到错误:“实例成员”presentingViewController“不能用于类型“SecondViewController”。您正在对类型调用该方法,但必须对实例调用它,该行必须位于一个方法内。@vadian self.presentingViewController,顾名思义,它显示的是视图本身,而不是父视图。实际上,显示的控制器是当前控制器。呈现控制器实际上是父视图控制器。谢谢Vadian-但当我尝试此操作时,我得到错误:“实例成员”presentingViewController“不能用于类型“SecondViewController”。您正在对类型调用该方法,但必须对实例调用它,该行必须位于一个方法内。@vadian self.presentingViewController,顾名思义,它显示的是视图本身,而不是父视图。实际上,显示的控制器是当前控制器。演示控制器实际上是父视图控制器。谢谢Horatiu。我想我需要花更多的时间来研究协议和授权——只是我还没有想到。同时,瓦迪安的回答让我知道我现在需要做什么。谢谢霍拉修。我想我需要花更多的时间来研究协议和授权——只是我还没有想到。与此同时,瓦迪安的回答让我知道了我目前需要做什么。