Swift 在'中访问变量或函数;家长';班
总的来说,我对编程相当陌生——特别是对Swift——但最近有一件事我一直在绞尽脑汁 我试图访问“parent”类中的一个变量,但我不知道如何访问它 我已经看过了其他的帖子,它们似乎都涵盖了同样的内容-,和-,但它们似乎都不是我想要的 我希望能够有一个首选项设置窗口,我可以设置并应用到我的“main”类中的变量,但我看不到如何将变量从首选项窗口传递到“main”类 下面是一个示例,我在第一个ViewController上定义了一个NSTextField,我希望能够在第二个ViewController中修改它,并在第一个ViewController中更新它。我的实际应用程序可能需要许多这样的实例,以便提供一整套可修改的首选项Swift 在'中访问变量或函数;家长';班,swift,macos,Swift,Macos,总的来说,我对编程相当陌生——特别是对Swift——但最近有一件事我一直在绞尽脑汁 我试图访问“parent”类中的一个变量,但我不知道如何访问它 我已经看过了其他的帖子,它们似乎都涵盖了同样的内容-,和-,但它们似乎都不是我想要的 我希望能够有一个首选项设置窗口,我可以设置并应用到我的“main”类中的变量,但我看不到如何将变量从首选项窗口传递到“main”类 下面是一个示例,我在第一个ViewController上定义了一个NSTextField,我希望能够在第二个ViewControlle
// 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。我想我需要花更多的时间来研究协议和授权——只是我还没有想到。同时,瓦迪安的回答让我知道我现在需要做什么。谢谢霍拉修。我想我需要花更多的时间来研究协议和授权——只是我还没有想到。与此同时,瓦迪安的回答让我知道了我目前需要做什么。