2017-02-22 4 views
0

に来たことを検出します! 私はこのビューコントローラに来たものを検出するコードをどのように作成することができますかがどのページから私はこれを行う方法を知りたい現在のページ

ここで私の答えを検索しましたが、 重要なことは、私のアプリにナビゲーションがないことです!

+0

あなたはブール変数は、私は、ナビゲーションを持っていない –

+0

をナビゲートしながら、isFromFirst'検出および偽真渡す '言う維持することができます私のアプリで質問を編集しました –

+1

あなたはナビゲーションがない場合、どうやってナビゲートしていますか?適切に手助けをするために詳細を教えて、コードスニペットを表示してください。 –

答えて

0

新しいインスタンスにプロパティとしてビューコントローラを渡すだけで、それを行う方法はたくさんあります。しかし、あなたのケースでは、ナビゲーションコントローラーと同じ方法でビューコントローラーのスタックを保持する静的変数を作成する方が意味があります。

UIViewControllerサブクラスの間でのみこれを行う場合は、他のすべてのView Controllerが継承する別のサブクラスを作成することをお勧めします。それをTrackedViewControllerとしましょう。

class TrackedViewController : UIViewController { 

    static var currentViewController: TrackedViewController? 
    static var previousViewController: TrackedViewController? 

    override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

     TrackedViewController.previousViewController = TrackedViewController.currentViewController 
     TrackedViewController.currentViewController = self 
    } 
} 

今あなたがそれらはすべてclass MyViewController : TrackedViewController {としてTrackedViewControllerから継承されるように追跡したいすべてのView Controllerを変更する必要があります。そして、それはかなりです。プロジェクト内の任意の場所で現在のビューコントローラをTrackedViewController.currentViewController、以前のビューコントローラをTrackedViewController.previousViewController経由で見つけることができます。だからあなたは次のようなことを言うことができます:

if let myController = TrackedViewController.previousViewController as? MyViewController { 
    // Code here if the screen was reached from MyViewController instance 
} 

ここで私がやったやり方は、いくつかの副作用を持つかもしれないビューコントローラのインスタンスです。

  1. 最も大きな問題は、以前のコントローラが現在のView Controllerと共に保持されていることです。つまり、必要のないメモリに2つのコントローラがある可能性があります。
  2. あなたはBBからCへと背中に、コントローラAから行く場合は、前のビューコントローラはC、ないAです。これは望ましくない結果になるかもしれません。
  3. システムは他のすべてのView Controllerを無視します。したがって、TrackedViewControllerのサブクラスではないものを使用すると、その呼び出しは無視されます。ABUITableViewControllerCは、別の画面があるにもかかわらずが提示されたと報告します。再度これは期待される結果かもしれません。

だから、ポイント2と3はあなたに優れているならば、あなただけの2つのプロパティに保持を削除するためにweakを使用することができますが、その後、あなたが以前の情報を失うポイント1を修正するために、天候を決定する必要がありますコントローラーの割り当てが解除されている場合は、コントローラーを表示します。また、あなたには、いくつか列挙か何かで文字列を置き換えることが

class TrackedViewController : UIViewController { 

    static var currentViewControllerID: String? 
    static var previousViewControllerID: String? 

    override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
     TrackedViewController.previousViewControllerID = TrackedViewController.currentViewControllerID 
     TrackedViewController.currentViewControllerID = self.screenIdentifier 
    } 

    var screenIdentifier: String { 
     return "Default Screen" // TODO: every view controller must override this method and have unique identifier 
    } 

} 

:だから他の選択肢はいくつかの識別子を使用することです。それらをいくつかの関連する値と組み合わせることは、非常に強力なツールを作り出すことができます。

+0

は機能しません! –

+0

私はそれをテストし、それは動作します。難しいと書かれているが、コードはコンパイルされない。私はそれを修正してみましょう... –

+0

私はちょうど前のページが例えばmyView Controller {print( "OK")} –

0

私の答えがあなたの特定のケースであなたを助けてくれるかどうかはわかりませんが、ここに私があなたが求めているところから見える実装があります。たぶんそれはあなたに影響を与えるでしょう。

あなたのホームページにあるか、どんなviewControllerであっても、他のものをスローしたいと思っていますが、どのviewControllerから来たのか知りたいと思っているとします。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:segue_VC1]) { 
     CustomViewController1* destinationVC = segue.destinationViewController; 
     destinationVC.fromSegue = @"I AM VC 1"; 
    } 
    if ([segue.identifier isEqualToString:segue_VC2]) { 
     CustomViewController2* destinationVC = segue.destinationViewController; 
     destinationVC.fromSegue = @"I AM VC 2"; 
    } 
} 

さらに重要なことは、segueでアクセスする宛先ビューコントローラから属性にアクセスできることです。

私はこれがObj Cであることを知っていますが、実装はまだ同じです。

ViewControllerから別のViewControllerにナビゲートするときに、destinationViewControllerの属性を設定することができます。あなたがナビゲートしたいビューコントローラにあるとき

その後、次のことが確認できます。

if ([_fromSegue isEqualToString: "I AM VC 1"]) 
    // do specific stuff when you come from VC 1 
else if ([_fromSegue isEqualToString: "I AM VC 2"]) 
    // do specific stuff when you come from VC 2 
else 
    // other case 
+0

が残念ながらうまくいきません:( –

関連する問題