0

タイトルは質問を非常に明確に設定します..しかし、これは潜在的に物事をより明確にするための少しの文脈です:

UINavigationControllerをルートVCとしてメインウィンドウに接続する電子メールクライアントアプリに取り組んでいます(UIの仕組みの下にUIの階層が表示されます)。

    HomeViewController *homeController = [[HomeViewController alloc] initWithNibName:@"HomeView" bundle:nil];
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:homeController];
    [self.window addSubview:navController.view];

後で、ビューコントローラをナビゲーションコントローラにプッシュします。つまり、フォルダビュー->メールボックスビュー->メールビューなどです。

[self.navigationController pushViewController:someController animated:YES];

メールビューにスライディングビューコントローラ効果を実装したいと思います。

問題は、スライディングビューコントローラーエフェクトがカスタムコンテナビューコントローラーとして実装されていることです。前提条件は、ウィンドウルートビューコントローラーである包含ビューコントローラー(それを呼びましょうECSlidingViewController)を起動することによってアプリを開始することです。次に、トップビューコントローラー(つまり、表示される最初のビューコントローラー)をアプリに追加します。

ECSlidingViewController *slidingViewController = (ECSlidingViewController *)self.window.rootViewController;

slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstTop"];

次に、トップビューコントローラーの下に表示されるはずのビューコントローラーを接続します(slidingViewControllerこの例では、常にコントローラーのみが含まれています)。

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];

  if (![self.slidingViewController.underLeftViewController isKindOfClass:[MenuViewController class]]) {
    self.slidingViewController.underLeftViewController  = [self.storyboard instantiateViewControllerWithIdentifier:@"Menu"];
  }

  [self.view addGestureRecognizer:self.slidingViewController.panGesture];
  [self.slidingViewController setAnchorRightRevealAmount:280.0f];
}

私が理解しようとしているのは..私のメールビューが技術的にはの子ビューコントローラであるUINavigationControllerことを考えると、このいわゆる子になることもできECSlidingViewControllerますか?b / c navコントローラーによってペアレント化/制御されるナビゲーションコントローラーに含まれるようにし、上下にスライドさせたい。これは、の子である必要があることを意味しますECSlidingViewController

さらに、VCが複数の親を持つことができると仮定すると、上記の例のコンテキストでは、ビュー階層のどこにその親を追加する必要がありますか?UINavigationControllerの子として追加する必要がありますか?それはベストプラクティスと一致しますか(いくつかあると仮定して)?

4

1 に答える 1

1

簡潔な答え

いいえ..ビューコントローラーには複数の親コントローラーを含めることはできません..これは、 UIViewクラスリファレンスの説明でほぼ明示的に言及されてViews can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview. います 複数の親コントローラー。

長い答え

多くの調査とコードで遊んだ後..問題を間違って見ていたことが判明しました..長い話を短くするために..カスタムコンテナビューコントローラは、UINavigationのような事前構築されたコンテナコントローラに適用されるのと同じルールに従いますおよび UITab.. 任意の時点で、カスタム コンテナーを別のコントローラーの子として含めることができ、その逆も可能です

A container controller can be both a parent to other controllers and a child of another container. Ultimately, this combination of controllers establishes a view controller hierarchy.

したがって、2 つの親を同じビュー コントローラーにアタッチする必要があるかどうか疑問に思っている場合は、おそらくビュー階層アーキテクチャを再考する必要があります..b/c このシナリオは発生しないはずです。上記の質問のコンテキストで.. UINavigationController をカスタムを含むコントローラーの子にする必要があります..そして、子と親の間、および兄弟間の通信の柔軟性があるため.. UINavigation を上下にスライドさせることができますメールビューが選択されている場合。

于 2013-01-10T07:47:56.340 に答える