に来たことを検出します! 私はこのビューコントローラに来たものを検出するコードをどのように作成することができますかがどのページから私はこれを行う方法を知りたい現在のページ
ここで私の答えを検索しましたが、 重要なことは、私のアプリにナビゲーションがないことです!
に来たことを検出します! 私はこのビューコントローラに来たものを検出するコードをどのように作成することができますかがどのページから私はこれを行う方法を知りたい現在のページ
ここで私の答えを検索しましたが、 重要なことは、私のアプリにナビゲーションがないことです!
新しいインスタンスにプロパティとしてビューコントローラを渡すだけで、それを行う方法はたくさんあります。しかし、あなたのケースでは、ナビゲーションコントローラーと同じ方法でビューコントローラーのスタックを保持する静的変数を作成する方が意味があります。
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
}
ここで私がやったやり方は、いくつかの副作用を持つかもしれないビューコントローラのインスタンスです。
B
B
からC
へと背中に、コントローラA
から行く場合は、前のビューコントローラはC
、ないA
です。これは望ましくない結果になるかもしれません。TrackedViewController
のサブクラスではないものを使用すると、その呼び出しは無視されます。A
〜B
〜UITableViewController
〜C
は、別の画面があるにもかかわらずが提示されたと報告します。再度これは期待される結果かもしれません。だから、ポイント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
}
}
:だから他の選択肢はいくつかの識別子を使用することです。それらをいくつかの関連する値と組み合わせることは、非常に強力なツールを作り出すことができます。
は機能しません! –
私はそれをテストし、それは動作します。難しいと書かれているが、コードはコンパイルされない。私はそれを修正してみましょう... –
私はちょうど前のページが例えばmyView Controller {print( "OK")} –
私の答えがあなたの特定のケースであなたを助けてくれるかどうかはわかりませんが、ここに私があなたが求めているところから見える実装があります。たぶんそれはあなたに影響を与えるでしょう。
あなたのホームページにあるか、どんな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
が残念ながらうまくいきません:( –
あなたはブール変数は、私は、ナビゲーションを持っていない –
をナビゲートしながら、isFromFirst'検出および偽真渡す '言う維持することができます私のアプリで質問を編集しました –
あなたはナビゲーションがない場合、どうやってナビゲートしていますか?適切に手助けをするために詳細を教えて、コードスニペットを表示してください。 –