2

うまく機能するSVCセットアップがあります。SPC のマスター ビューと詳細ビューはどちらも UINavigationController であり、それぞれに個別のルート ビュー コントローラーがあります。

私のアプリケーションは完璧に動作します。縦向きモードでも横向きモードでも起動でき、すべてが正常に機能します。「マスター」ポップアップ ボタンは、ポートレート モードでは表示されますが、ランドスケープ モードでは非表示になります。マスター プレーンとディテール プレーンの両方が適切にアニメートおよび回転し、ポップや奇妙なアニメーション アーティファクトは存在せず、すべてが適切にストレッチされます。仕様ごとに 100% の満足度。

詳細ビュー コントローラーを置き換えると問題が発生します。uinavi コントローラーのルート ノードを置き換えることはできないため、新しい を作成UINavigationControllerし、詳細ビューで必要な新しいビューを割り当てます。詳細ビューのビューは 1-2-3 レベルの深さを実行できるため、これを行いますが、一意の「ルート」ビューを割り当てることができる必要があります (たとえば、ルートを完全に置き換えることができる必要がありますUINavigationController)。

コードは次のようになります。

self.detailViewController = [[SomeNewController1of3 alloc] initWithNibName:@"SomeNewController1of3" bundle:nil];
self.splitViewController.delegate = self.detailViewController;
UINavigationController *newNC = [[UINavigationController alloc] initWithRootViewController:self.detailViewController];
self.splitViewController.viewControllers = @[navigationController, newN];

まず、それが何であれ、新しいビューコントローラーを作成します。次に、splitviewcontroller のデリゲートを = 新しく作成された viewcontroller に設定します (そのためwillHideViewController、 などが起動します)。次に、新しく作成されたビューコントローラーを格納するナビコントローラーを作成して、そこからプッシュおよびポップできるようにします。最後に、分割ビュー コントローラーの 2 番目の (詳細) ビューを新しいナビ コントローラーに置き換えます。

繰り返しますが、このプランは横向きで始めると問題なく機能します。

ポートレートで始めたとき、これらは私が気づいた異常です:

  1. すべてのポップアップ (アラート ボックス、マスター ビューなど) は奇妙な回転をしており、表示されるとぎこちない場所から飛び出します。これらのポップアップは、正しい位置から単純に「スライド」するのではなく、表示されたときに右に回転するように見えます。
  2. マスター ビューが表示されると、上記の奇妙な回転を行った後、一瞬完全に消えて (黒い空の領域が残ります)、元の場所に戻ります。
  3. デバイスのローテーションが完了するまで、マスター ビューのポップアップを表示する詳細ビュー コントローラーの「マスター」ボタンが表示されません。willHideViewControllerブレークポイントで確認した後、上記の方法で呼び出されていないと結論付けました。

私が得られないのは、ランドスケープで開始するとすべてが完璧に動作するのに、これらすべてのエラーがポートレートで発生する理由です? 私のすべてのビューは、実際には IB でデフォルトの向きが縦に設定されており、サイズに合わせて調整されています。また、それらがクレイジーなインターフェースであるというわけではありません。それらはすべて単なるストックテーブルビューです。

この問題に遭遇した人、または回避する方法を見つけた人はいますか?

4

2 に答える 2

0

SplitViewController をサブクラス化する方が簡単だと思います。そこから、navController を必要とするものに追加する詳細を簡単に交換できます。

UISplitViewController をサブクラス化し、ルート splitViewController をそのクラスに設定します。次に、このメソッドを UISplitViewController サブクラスに追加します。

-(void)setDetailControllerTo:(UIViewController *)detailController withNavControllerTitle:(NSString *)title {
[detailController view]; // this line forces the viewDidLoad method to be called

if (title) {
    UINavigationController *navController = [[UINavigationController alloc] init];
    [navController pushViewController:detailController animated:YES];
    detailController.title = title;

    NSArray *viewControllers=@[self.mainController.viewControllers[0],navController];
    self.mainController.viewControllers = viewControllers;
} else {
    NSArray *viewControllers=@[self.mainController.viewControllers[0],detailController];
    self.mainController.viewControllers = viewControllers;
}

}

このメソッドを呼び出すには、tableView:didSelectRowAtIndexPath: メソッドのマスター ビュー コントローラーから次のようにします。

FixedSplitViewController *splitController = (FixedSplitViewController*) self.splitViewController;

CurrentEventViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"CurrentEventViewController"];
// add any setup code here
[splitController setDetailControllerTo:controller withNavControllerTitle:@"Current Event"];

マスター ビューを縦向きに回転させて表示したい場合は、このメソッドを SplitViewController サブクラスに追加します。

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return NO;
}
于 2013-11-08T16:17:42.263 に答える