2016-05-03 63 views
1
一個「父」類

我一般很新的節目 - 和斯威夫特特別 - 但有一件事我一直在敲打我的腦袋上最近。訪問變量或函數在

我想在一個「父」類來訪問一個變量 - 但我不知道如何到達那裏。

我已經看了看,似乎涵蓋同樣的事情,其他職位 - 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 - 但他們都不做的正是我想要的。

我想能夠有一個首選設置窗口,我可以設置並適用於我的'主'類中的變量 - 但我看不到如何從首選項窗口傳遞變量直到'主'級。

下面是我已經在我的第一個視圖控制器,我希望能夠在我的第二個ViewController中進行修改,讓它在第一次更新定義的的NSTextField的例子。我的實際應用程序可能需要許多此類實例,以提供一整套可修改的偏好。

// 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. 
} 

} 

正如你看到的,我有這個問題是在closeButton功能在SecondViewController類 - 如何通過價值回升在的ViewController類的textString變量?

我一直在尋找代表團和NSNotificationCenter - 但我真的不知道我是否在這裏咆哮正確的樹 - 感覺就像我將不得不實施比我更復雜的事情期望這樣的(看似)簡單的要求。

任何建議非常歡迎 - 謝謝。

回答

0

在一個情節串連圖板OSX NSViewController有一個屬性presentingViewController表示父視圖控制器。

SecondViewController,你可以參考呈現控制器

let parentViewController = presentingViewController as! ViewController 
+0

感謝Vadian - 但是當我嘗試,我得到了錯誤:「實例成員‘presentingViewController SecondViewController‘’’不能在使用類型」。 – Moisie

+0

您正在調用該類型的方法,但必須在實例上調用它,該行必須在方法內。 – vadian

+0

啊!太棒了 - 這個很有用! :-) 謝謝!! – Moisie

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 { 

    } 
} 
+0

謝謝Horatiu。我想我需要花更多的時間來研究協議和委託 - 它只是沒有點擊我。在此期間,Vadian的回答讓我知道我目前需要做的事情。 – Moisie