解雇iPad模态视图会弄乱UISplitView面板

时间:2010-08-29 21:15:03

标签: modal-dialog ipad dismiss

前提非常简单:我想在使用UISplitViewController的iPad应用中显示模态视图。

视图层次结构很简单:

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

当我点击TableViewController1中的一个表格单元格时,我打开一个模态视图:

- (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单元格。尽管根视图是一个popover(可能是一个充足的bug来源),但一切正常。

我已尝试过的一些事情没有成功:

  • 转储标签栏,只显示TableViewController1作为拆分视图的根控制器
  • 创建一个委托协议,以便父TableViewController1解除模态视图而不是MyModalClass视图本身。
  • 在TableViewController1.splitViewController上显示/解除模态视图实际上会使事情变得更糟:视图甚至没有出现。
  • 牺牲几只山羊也没有帮助。

我非常感谢有关此问题的任何意见。

2 个答案:

答案 0 :(得分:0)

我对自己的问题有一个简单的回答:我使用Instruments系统地消除了我的应用程序中的所有内存泄漏。一旦我这样做了,问题就消失了。

答案 1 :(得分:0)

我和你有同样的问题,我通过编程暂时强制旋转我的呈现viewController(一旦返回它),在其viewDidAppear方法中进行一些任意旋转。当然没有动画。然后将其旋转回所需的方向(我在旋转之前保存)。

因此,如果vc1以模态方式显示vc2,并且用户旋转vc2,我通过调用以下方法根据vc2的当前方向设置vc1的方向: UIInterfaceOrientation currentOrientation = self.interfaceOrientation; //存储vc2的当前方向(模态视图) [vc1 willRotateToInterfaceOrientation:currentOrientation duration:0];

然后我解除vc2并在vc1的viewWillAppear中执行此操作:

- (void)viewDidAppear:(BOOL)动画{

[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.

}