10

UIViewControllerが現在表示されているかどうかを確認するにはどうすればよいですか?UIViewControllerが現在表示されているかどうかを確認するにはどうすればよいですか?

私のUIViewControllersは、NSNotificationsをリッスンしています(表示されていない場合でも)。だから私はからNSNotificationCenterまでの1UIViewControllerをバックグラウンドで観察することができました。 NSNotificationが投稿され、UIViewControllerで受信されたとき、私はそれが現在表示されているかどうか調べたいと思います。そうでない場合は、ビューが表示されたときに処理されるようにブール値を設定します。現在表示されている場合は、すぐにテーブルを更新するなど、もっと多くのことを行います。

+0

どのように表示コントローラのビューを表示していますか? – tdubik

+0

@tdubik:pushViewControllerのような従来の方法。私はストーリーボードやセグを使用していません。 – ikevin8me

+0

この場合、 'UINavigationController'クラスから' topViewController'をチェックすることができます。または、さらに処理したい場合は、コントローラが 'viewControllers'配列を列挙します。 – tdubik

答えて

13

あなたはかどうかを確認する必要がありますあなたのviewcontrollerは、ナビゲーションコントローラのviewcontroller配列のスタックの上にあります。サンプルコードは、現在のビューが表示されているかどうかをチェックするviewWillAppear方法内側これを使用することができ、

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

あります。

+1

@ DBDの回答はより一般的なものであり、質問のタイトルはそれほど具体的ではないので、今後の読者にはより役立つでしょう。 – Zedenem

1

viewWillDisappearで通知リスナーを削除して、それをviewWillAppearに追加しないのはなぜですか?

編集:ご迷惑をおかけして申し訳ありません。

提案された回答:viewDidDisappearとviewDidAppearに独自のフラグ(BOOL)を設定します。

+0

これを削除すると、すべての通知が失われるため、これは機能しません。 – ikevin8me

+0

次に、viewWillDisapearのフラグ(BOOL)を設定すると、ビューがもう表示されないことを示します。通知を受信したら、フラグをチェックして、ビューが表示されているかどうかを確認します。 – yuf

+0

通知が来たら、私はテーブルをリロードする必要があります。それが来なければ、それをするには高価すぎる。さらに、ビューが同じ理由で再表示されたときにテーブルをリロードする必要はありません。データは同じで高価すぎます。 – ikevin8me

0

viewController.view.superviewのチェックがうまくいくと思います。

+0

私は本当に理解していません。あなたはどのように比較をしますか? – ikevin8me

+0

'if(viewController.view.superview!= nil)' – tdubik

+0

問題は、ビューがスーパービューに添付されている可能性がありますが、スーパービューがウィンドウにアタッチされていない可能性があります。 。 – DBD

6

ウィンドウに添付されているかどうかを確認してください。それはnilない場合は、画面に添付された階層内のだ(もちろん、それが画面の境界をオフすることができ、他のいくつかのビューでカバーまたは非表示フラグが設定されている)

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

閉じるが、ビューがウィンドウ内にあるかどうかをチェックする前に、ビューがロードされているかどうかチェックする必要があります: 'if(self.isViewLoaded && self.view.window!= nil)...' –

+0

@rob。はい。それで合っています。ビューコントローラがロードされておらず、 'view'オブジェクトにアクセスすると、レイジーローディングが発生します。これは、実際に使用する準備ができていないものをメモリにロードすることを意味します。それでも正しい答えが得られるものの、それは理想的な性能よりも劣るでしょう。初期化されていないビューは決して添付されないので、ビューがロードされたときにのみ通知が追加されるという仮定をしました。それでも、それはおそらく不適切な仮定であり、他に何も言わなければならないはずのものでした。 – DBD

+0

これは本当に正解で、@ robmayoffの変更が統合されているはずです。 – Bill

4

viewWillAppearviewWillDisappearの方法でフラグを使用できます。

1

各ViewControllerにタイトルを指定して、現在のViewControllerのタイトルを以下のコードで取得します。

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

} 
関連する問題