26

UINavigationController のナビゲーション スタックにプッシュするか、任意の UIViewController から (モーダルに) 提示できる UIViewController サブクラスを作成しました。ビュー コントローラが表示されているかどうかを確認する必要があります。表示されている場合は、ビュー コントローラの上部に閉じるボタンのあるツールバーを追加する必要があります。(それ以外の場合は、ナビゲーション スタックにプッシュされた場合、ユーザーが戻ることができることを使用して、既定の閉じるボタンが追加されます。)

利用可能なすべてのバージョンで、UIViewController サブクラス内から 4.3、5.0、6.0 まで、次の条件が満たされている場合、View Controller が (モーダルに) 提示されていると想定できますか。

if(self.parentViewController == nil || self.navigationController == nil)
4

13 に答える 13

36

iOS 5 では、 UIViewController は という名前の読み取り専用プロパティを取得しました。これpresentingViewControllerは、 の古いセマンティクスを置き換えますparentViewController(現在は contention について説明しています)。このプロパティは、View Controller がそれを提示している View Controller に到達する必要がある場合に使用できます — 注: API を初めて使用する場合、これは多くの場合、予想とは異なるものになるでしょう!

さらに、このisBeingPresentedプロパティは、現在直面している一連の状況をほぼ解決するために導入されました。View Controller の でこのプロパティを確認してくださいviewWillAppear:

アップデート

iOS 4.3 もターゲットにしている
ようです。isBeingPresentedif ([self respondsToSelector:…])else

下位互換性への別のアプローチは、オーバーライドして実行時+resolveInstanceMethod:の実装を追加すること-isBeingPresentedです。これにより、呼び出し元のサイトがクリーンなままになり、古い iOS サポートを手放すとすぐにランタイム マジックを取り除くことができます ;-)

ただし、iOS <5 で実行する場合は、これにはエッジ ケースがあり、最初のアプローチもあることに注意してください。

ビュー コントローラーは、ナビゲーション コントローラーを含む他のビュー コントローラーに含まれて表示できます。その最後のケースが発生すると、運が悪くparentViewControllerなります。扱いにくいコードの塊を追加して、古い iOS でのこの制限を緩和することを試みることもできますが、それを手放すこともできます。nilnavigationController

于 2013-03-06T07:43:53.527 に答える
8

同様のケースがありましたが、提示したView Controllerは独自の Navigation Controller にラップされています。したがって、そのView Controllerで、閉じるボタンと戻るボタンを追加するかどうかを決定する必要がある場合、ナビゲーションコントローラーのスタックサイズを確認するだけです。画面が表示されている場合、スタック サイズは 1 である必要があります (閉じるボタンが必要です)。また、既存のナビゲーション コントローラーを使用してプッシュされた場合、スタック サイズは 1 よりも大きくなります (戻るボタンが必要です)。

BOOL presented = [[self.navigationController viewControllers] count] == 1;
于 2014-04-09T00:08:14.403 に答える
7

この種の動作を処理するために、私は通常、viewWillAppear/viewWillDisappear メソッドで切り替える BOOL を設定/リセットします。

ところで、あなたのテスト条件は間違っているようです。使うべきだと思います

if(self.parentViewController != nil || self.navigationController != nil)

ビュー コントローラーに常にツールバーを追加できないのはなぜですか? ビューがロードされても表示されない場合はありますか?

于 2013-02-26T14:10:15.710 に答える
3

@さいかメッシュ。

UINavigationController を使用して viewController をナビゲートする場合、topViewController( Doc here ) とvisibleViewController( Doc again ) を使用して目的を達成できると思います。

あなたはそれを言及します:

ナビゲーションスタックにプッシュされると、デフォルトの閉じるボタンが追加され、ユーザーはそれを使用して戻ることができます

特定の UIViewController のインスタンスが重要な場合は、共有シングルトン インスタンスを作成し、グローバルに提示されたフラグを提供することをお勧めします。

id specificVC = [SpecificViewController sharedInstance];
if (specificVC.isPushed) {
    [self.navController popToViewController:specificVC animated:YES];
}

それが提示されているかどうかを確認するには:

if ([self.navController.visibleViewController isKindOfClass:[SpecificViewController class]]) {
    // Hide or add close button
    self.isPresented = YES;
}

または、広く受け入れられている回答を読むことができます。

:) 希望が役立ちます。

于 2013-03-01T06:54:15.783 に答える
2

この方法で確認してください:

 for (UIViewController*vc in [self.navigationController viewControllers]) {
    if ([vc isKindOfClass: [OffersViewController class]]){ //this line also checks OffersViewController is presented or not 

        if(vc.isViewLoaded){
             NSLog(@"Yes");
        }

    }
}
于 2013-03-01T06:27:42.207 に答える
1

モーダル ビュー コントローラーが表示されているかどうかは、ナビゲーション コントローラーの modalViewController プロパティを使用していつでも確認できます。元:

   UIViewController *presentedController = self.navigationController.modalViewController;
   if (presentedController) {
      // At this point, you have a view controller presented from your navigation controller
      if ([presentedController isKindOfClass:[controllerYouWantToCheck class]]) {
         // add your toolbar/buttons/etc here
      }
   }
于 2013-03-05T09:52:13.180 に答える
0

私だったら、カスタムの init メソッドがあり、VC を作成するときにそれを使用します。

vc = [[[MyUIViewControllerSubClass alloc] init] initWithToolbarAndCloseButton:YES];
于 2013-02-26T14:10:23.227 に答える