1

現在、次の方法でナビゲーション スタックをセットアップしています。

ViewController A-> ViewController B-> ViewController C->ViewController D

ViewControllerC との両方の実装コードにはViewController D、次のテストが満たされた場合にのみコード ブロックを実行するセレクターがあります。

if (self.navigationController.visibleViewController)

私が直面している問題は、上記のテストが に対して常に true を返すことですViewController C。まず、IOS シミュレーターでアプリケーションを起動し、View Controller D までスタックをナビゲートします。ViewController Dロードしたら、シミュレーターの「ホーム」ボタンを押します。ホームボタンを押した後、アプリをもう一度クリックして、アプリケーションを再起動します (フォアグラウンドに入ります)。今起こっていることは奇妙です。私に見えるViewController DView Controllerは です。それは私が最後にいたView Controllerだからです。ViewController D現在、私に見える唯一のView Controllerですが、上記のifステートメントもtrueを返していViewController Cます! ViewController D's(セレクターコードのみを実行したいのですが、これは問題です)。

したがって、これは質問を投げかけます. であるとは正確にはどういう意味ですか?また、私の前に表示されるView Controllerである場合にセレクターが実行されないようvisibleViewControllerにするにはどうすればよいですか..ありがとう!ViewController C'sViewController D

4

2 に答える 2

6

The visibleViewController is a property that returns the controller that is currently visible, not a boolean property returning YES or NO depending on whether or not the current controller is visible. As long as there is a visible view controller on the screen - any controller at all - the check of self.navigationController.visibleViewController will return YES, because any non-nil value passed to an if is considered a YES.

The check should be as follows:

if (self == self.navigationController.visibleViewController)

The comparison will return YES if the current view controller is the visible view controller of the navigation controller, and NO otherwise.

于 2013-08-02T01:00:31.667 に答える
1

visibleViewController will always return an object (at least with your setup) which makes your if statement always true -- it doesn't return true only if the controller you have that code in is on screen. Instead you should use self.view.window as the test. It will only return true if self's view is on screen.

You could also still use self.navigationController.visibleViewController, but compare it to self to see if they're the same.

于 2013-08-02T01:00:03.500 に答える