2

前提は非常に単純です。UISplitViewControllerを使用するiPadアプリでモーダルビューを表示したいと思います。

ビューの階層は単純です。

                                              /- TableViewController1
                     /- root:TabBarController -- TableViewController2
SplitViewController -
                     \- detail:CustomViewController

TableViewController1のテーブルセルの1つをクリックすると、モーダルビューが開きます。

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
  UIViewController *vc = [[MyModalClass alloc] init];
  UINavigationController *nc = [[UINavigationController alloc]
                                initWithRootViewController:vc];
  nc.modalPresentationStyle = UIModalPresentationFormSheet;
  nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
  [self presentModalViewController:nc animated:true];
  [nc release];
  [vc release];
}

これは問題なく機能します。ビューが表示されます。問題は、風景以外の方向でそれを却下しようとしたときに始まります。

ModalViewControllerでは、次のメソッドがナビゲーションバーのUITabBarButtonによってトリガーされます。

- (void) closeButtonInNavBarWasClicked:(id)sender {
  [self dismissModalViewControllerAnimated:true];
}

そして、これが問題の始まりです。

このコードが呼び出されると、モーダルビューは表示されなくなりますが、TabBarController(分割ビューのルートビュー)が突然回転してサイズが変更されます。コンテンツは突然横向きになり、詳細ビューを部分的にカバーしています。詳細ビューはサイズ変更されて小さくなりません。ルートビューで部分的に覆われているだけです。

この問題が発生しない唯一の状況は、アプリがポートレートモードのときにTableViewController1セルをタップしたときです。ルートビューがポップオーバー(バグの十分な原因である可能性があります)にあるにもかかわらず、すべてが正常に機能します。

私がすでに試したいくつかのことは成功しませんでした:

  • タブバーをダンプし、分割ビューのルートコントローラーとしてTableViewController1を表示するだけです
  • 親TableViewController1がMyModalClassビュー自体ではなく、モーダルビューを閉じるように、デリゲートプロトコルを作成します。
  • TableViewController1.splitViewControllerでモーダルビューを表示/非表示にすると、実際には事態が悪化します。ビューは表示されません。
  • いくつかのヤギを犠牲にすることも助けにはなりませんでした。

この問題についてのご意見をいただければ幸いです。

4

2 に答える 2

0

私は自分の質問に対するある種の答えを持っています。私はInstrumentsを使用して、アプリ内のすべてのメモリリークを体系的に排除しました。私がそれをしたら、問題は消えました。

于 2010-10-24T21:10:12.630 に答える
0

私はあなたと同じ問題を抱えていました。viewDidAppearメソッドで、提示しているviewControllerをプログラムで一時的に強制的に強制的に回転させて解決しました。もちろんアニメーションなし。次に、それを目的の方向に回転させて戻しました(回転前に保存しました)。

したがって、vc1がvc2をモーダルに表示し、ユーザーがvc2を回転させる場合、UIInterfaceOrientation currentOrientation = self.interfaceOrientation;を呼び出して、vc2の現在の方向に従ってvc1の方向を設定します。// vc2の現在の向きを保存します(モーダルビュー)[vc1 willRotateToInterfaceOrientation:currentOrientation duration:0];

次に、vc2を閉じ、vc1のviewWillAppearでこれを行います。

-(void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

/* Store wanted orientation */
UIInterfaceOrientation currentOrientation = self.interfaceOrientation; 

/* rotate to some arbitrary orientation, this solves the bug. */
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO]; 

[[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.

}

于 2013-02-27T10:24:50.910 に答える