2013-08-19 19 views

答えて

19

あなたはUINavigationControllerDelegateプロトコルを使用して、定義することができますので、移動先のコントローラのメソッドを書くことができ、ここでそれを呼び出します示されているように、セグの完了を知らせるために、代理人。セグを追跡する別の論理的な場所は、AppDelegateです。

ビューコントローラ(略してVC)からそれをやっての例:

class MyViewControllerSubclass : UIViewController, UINavigationControllerDelegate { 

    func viewDidLoad() { 
     self.navigationController.delegate = self 
    } 

    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     println("Did show VC: \(viewController)") 
    } 
} 

しかし、VCへのセグエが完了したとき、それはあなただけを示し、VCでのでしょうviewWillAppear()またはviewDidAppear()デリゲートメソッドとして 提示される;ただし、ターゲットVCがいつであるかについては通知しません。が表示されます。

追跡しているVCでは、VC(およびそのメモリ)の割り当てが解除されたことを検出するために以下を追加するか、viewWillDisappear()メソッドを上書きすることができます。

deinit { 
    println(__FUNCTION__, "\(self)") 
} 
+0

私が期待したほど悪くはありませんでした。 'self.navigationController = self;'そしてそのメソッドを追加します。 Segue IDに基づいてコントローラをローカル変数に保存し、それらの値を渡された 'ViewController'と比較しました。 –

+7

これは、元のビューコントローラにナビゲーションコントローラがあるプッシュセグの場合に機能しますが、モーダルセグの場合はどうしたらいいですか? – Drux

+1

私はLeviのカスタムSegue答えを使って、ここの例のように 'perform'を実装しました:http://stackoverflow.com/a/23778394/586489これは非常にうまく動作します。プッシュが完了し、セグを使うことができます。 –

14

viewDidAppear:メソッドを使用しない場合は、カスタムセグを作成できます。 performメソッドでは、トランジションにアニメーションを使用し、それには完了ブロックを使用できます。アニメーションが完了したら、そこにコードを追加できます。

+0

ストーリーボードの標準的なドラッグアンドドロップセグは使用できません。 – hakonbogen

+2

これはどのように作成するのですが、 'UIStoryboardSegue'をサブクラス化し、その中に' perform'メソッドを実装する必要があります。その後、 'storyboard'でセグのクラスをあなたが作成したクラスに設定します。 – Levi

-9

あなたが使用することができます - (無効)prepareForSegue:(UIStoryboardSegue *)セグエ送信者:(ID)の送信者を

セグエは、ソースのUIViewControllerで行われる直前に、このメソッドが呼び出されます

。宛先UIViewControllerでいくつかのコードを実行したい場合は、segueの宛先viewcontrollerを取得できます。

このコードをdesintation viewControllerのviewdidAppearに追加することもできます。

-9

prepareForSegueメソッドで宛先UIViewControllerのメソッドを呼び出すことができます。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSLog(@"prepareForSegue: %@", segue.identifier); 

    if ([segue.identifier isEqualToString:@"Happy"]) { 
     [segue.destinationViewController setHappiness:100]; 
    } else if ([segue.identifier isEqualToString:@"Sad"]) { 
     [segue.destinationViewController setHappiness:0]; 
    } 
} 

ここに設定されている方法は宛先コントローラであり、ここでは100が通過しています。

– navigationController:didShowViewController:animated: 
+3

これは、実際のセグが完了したときに実際には表示されません。これはセグの開始時に発生します。 – Sam

7

をスウィフトでは、UIViewControllerサブクラスからあなたがUINavigationControllerインスタンスを取得することができますし、設定します。

関連する問題