2016-03-18 9 views
0

から更新された変数値にアクセスする私は、3つの異なるビューコントローラとのプロジェクトを持っている:別のビューコントローラ

のViewController(ここで、ユーザの入力値、これはある)、LoadingViewController(ロード画面)、およびAnswerViewController(私はしたいです最初のビューコントローラで更新された値の結果をロードする)ここで

はのViewControllerのコードです:あなたが見ることができるように、このビューコントローラに私が先頭に変数を作成しました

var calculatedRatio: Double? 

@IBOutlet weak var boysCountTextField: UITextField! 
@IBOutlet weak var girlsCountTextField: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func calculateButtonTapped(sender: UIButton) { 
    if boysCountTextField.text != "" && girlsCountTextField.text != "" { 
     calculateRatio() 
     self.performSegueWithIdentifier("loadingAnswer", sender: self) 
    } 
} 

func calculateRatio() { 

    let boysCount = Double(boysCountTextField.text!)! 
    let girlsCount = Double(girlsCountTextField.text!)! 

    let currentRatio = boysCount/girlsCount 

    calculatedRatio = currentRatio 
    print(calculatedRatio) 

} 

01と呼ばれるオプションのダブルである。同じビューコントローラーで、ボタンを押すと、calculateRatio()と呼ばれる下部の機能が実行され、calculatedRatioの値が更新されます。

私の質問はどのように私は別のビューコントローラ私は直接にsegueingておりません(AnswerViewController)でこの変数の新しい値にアクセスすることが可能です、ありますか?

私は既にAnswerViewController内にViewControllerのインスタンスを作成しようとしましたが、変数は関数で指定された新しい値ではなく、初期値(この場合はnil)でコピーされます。

+0

委任を使用してみましたか? – MikeG

答えて

0

したがって、複雑なメソッドを処理しているときに、独自のビューコントローラである読み込み画面を表示する必要があります。私はそこにモーダルオーバーレイのいくつかのタイプを実行するのではなく、ナビゲーションスタックに読み込み画面を投げたい理由があると仮定しています。私はまた、最初のView Controller(ロード画面とは対照的に)で計算が行われなければならない理由があると仮定しており、計算を他の場所から抽象化するための良い方法はありません。なぜNSNotificationsを試してみませんか? LoadingViewControllerで計算が終了するのを聞くことができ、更新値をオブジェクトとして渡すことができます。

+0

これをどうやってやりますか? –

+0

- (void)prepareForSegue:(UIStoryboardSegue *)segue送信者:(id)送信者 { if([[segue識別子] isEqualToString:@ "loadingAnswer"]){ LoadingViewController * destinationViewController = [segue destinationViewController]; destinationViewController。 calculatedRatio = selfです。calculatedRatio }} prepareForSegue FUNC –

+0

オーバーライド(セグエ:UIStoryboardSegue!送信者:!ANYOBJECT):LoadingViewController VCとしてLoadingViewController =セグエ.destinationViewController!{ 場合(segue.identifier == "loadingAnswerは"){ VCをしましょう。 calculatedRatio = selfです。 calculateRatio } } –

0

iOSアプリケーションの委任パターンを使用できます。ここであなたの問題を解決しようとしています。 AnswerViewControllerの代理人を実装するためにInput ViewControllerクラスをいくつか変更しました。ここで

class ViewController: UIViewController,AnswerVCProtocol { 
    var calculatedRatio: Double? 

    @IBOutlet weak var boysCountTextField: UITextField! 
    @IBOutlet weak var girlsCountTextField: UITextField! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

    @IBAction func calculateButtonTapped(sender: UIButton) { 
    if boysCountTextField.text != "" && girlsCountTextField.text != "" { 
     calculateRatio() 
     self.performSegueWithIdentifier("loadingAnswer", sender: self) 
    } 
    } 

    func calculateRatio() { 

    let boysCount = Double(boysCountTextField.text!)! 
    let girlsCount = Double(girlsCountTextField.text!)! 

    let currentRatio = boysCount/girlsCount 

    calculatedRatio = currentRatio 
    print(calculatedRatio) 

    } 

    // MARK: AnswerViewController Delegate 

    func getUpdateRadio()-> Double?{ 
    return self.calculatedRatio 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    // Please check you identifier as you given in storyboard 
    if segue.identifier == "loadingAnswer"{ 

     let ansVc = segue.destinationViewController as! AnswerViewController 

     ansVc.delegate = self 

    } 

    } 


} 

は、プロトコル

protocol AnswerVCProtocol{ 
    func getUpdateRadio()-> Double? 
} 

今、私はこのようなあなたのAnswerViewController何かを推測しています。ここでは、デリゲートを使用して変数にアクセスする方法を示します。

class AnswerViewController: UIViewController { 

    var delegate: AnswerVCProtocol? 

    override func viewDidLoad() { 
    <#code#> 
    } 
    // To receive update value call this function when you needed 
    // Receive Update Value from your Input ViewController 
    func updateRadio(){ 
    if let _ = self.delegate{ 
    let updateRatio = delegate?.getUpdateRadio() 
    } 

    } 

} 

概要

  1. プロトコルを宣言します。この場合AnswerVCProtocol

  2. 入力したViewControllerでプロトコルを確認します。

関連する問題