2016-05-03 11 views
1

私は一般的にプログラミングには新しく、特にSwiftには新しくありますが、最近私の頭を叩いてしまったことがあります。'親'クラスの変数や関数へのアクセス

私は '親'クラスの変数にアクセスしようとしていますが、どうやってそこに到達するのかは分かりません。 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を定義した例を示します。これは、2番目の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

OSXストーリーボードNSViewControllerには、親ビューコントローラを表すpresentingViewControllerというプロパティがあります。

SecondViewControllerでは、代表者とプロトコルを使用してみてください

let parentViewController = presentingViewController as! ViewController 
+0

おかげヴァディアン - しかし、私はこれをしようとすると、私はエラーを取得:「インスタンスメンバー 『presentingViewController SecondViewController『』』タイプに使用することはできませんが」。 – Moisie

+0

型のメソッドを呼び出していますが、インスタンス上で呼び出す必要があります。その行はメソッド内にある必要があります。 – vadian

+0

ああ!素晴らしい - これは動作します! :-)ありがとう! – Moisie

0

を呈するコントローラを参照することができます。子を作成するときは、その代理人を親に設定します。デリゲートメソッドの1つは、子が設定できるパラメータを持ち、親(またはデリゲートを実装するクラス)が読み取ることができます。

小さな例:

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

ありがとうございます。私は、プロトコルと代表団を勉強するのにもっと時間を費やす必要があると思う - それはまだ私をクリックしていない。それまでの間、ヴァディアンの答えは、私が現時点で必要としていることを私にもたらします。 – Moisie

関連する問題