2010-05-04 50 views
6

我试图在UISplitViewController中更改主视图控制器(出现在肖像中的弹出窗口中,以及在横向上的左侧)。我想在主视图控制器之间切换两个不同的UIViewControllers之一(取决于在我的应用程序中采取的其他操作)。UISplitViewController无法更改主视图控制器?

我使用以下:

mySplitViewController.viewControllers = [NSArray的arrayWithObjects:newMasterController,detailController,零]。

这正确地更改了主视图控制器,就像在横向模式下所期望的那样。然而,而不是似乎更改用于纵向模式中的弹出窗口的视图控制器。

我注意到barbuttonitem显示这个主视图控制器只是调用showMasterInPopover:在splitviewcontroller上,所以也期望它也可以在纵向模式下工作,但事实并非如此。

其实,我可以设置主视图控制器,看到正确的viewController在横向模式下,转动肖像,并在酥料饼使用的视图 - 控制是仍然旧的。

这是一个错误?

回答

1

更新:请在底部阅读最终更新! Oiginal answer +以下更新可能没有用处!

我们刚刚有完全相同的问题。有时我想知道Apple是否真的用类似于实际用例的方式测试他们编写的类,因为UISplitViewController不是他们最好的时刻。

问题是,当您在拆分视图中替换主视图控制器时,UISplitViewController中的代码不会更新其弹出窗口控制器的contentViewController属性。结果是弹出窗口控制器在过时的视图控制器上仍然有一个句柄,导致在纵向模式下出现旧UI,甚至出现内存错误。

这是我们的解决方法。

我将假设你有一个UISplitViewControllerDelegate符合类,它将popoverController存储为一个类属性(请参阅UISplitViewController的标准示例代码)。

在为你设置了新的主视图控制器的地步,你还需要更新contentViewController,如下所示:

mySplitViewController.viewControllers 
    = [NSArray arrayWithObjects:newMasterController, detailController, nil]; 

// in the cases where the uisplitview has already shown a popovercontroller, 
// we force the popovercontroller to update its content view controller. 
// This ensures any old content view in popover actually gets released by 
// the popovercontroller. 
if (popoverController) { 
    [popoverController setContentViewController:theMasterViewController 
           animated:NO];  
} 

您还必须设置酥料饼的contentViewController当你UISplitViewControllerDelegate被告知,酥料饼控制器会呈现一个视图控制器:

- (void)splitViewController:(UISplitViewController*)svc 
     popoverController:(UIPopoverController*)pc 
     willPresentViewController:(UIViewController *)aViewController 
{ 
    // set the popoverController property - as per Apple's sample code 
    self.popoverController = pc; 

    // THE LINE BELOW IS THE NEW LINE! 
    [popoverController setContentViewController:aViewController animated:NO]; 

是的,我知道上面的代码看起来疯了,你想知道为什么苹果不能只是设置的内容视图控制器本身。但他们显然不这样做,这是修复。

UPDATE

上述方案,与设置内容看,原来不要毕竟工作。例如,如果您将内容视图设置为uinavigationcontroller,稍后您将通过导航控制器内的根视图,而不是导航控制器本身。就我所见,UISplitViewController只是不能以任何可行的方式处理更改主视图。

我目前的解决方法是安装一个UINavigationController作为主视图,并更改该导航控制器的根视图控制器。所以我以某种方式改变了“后门”主视图。

更新2

我放弃了。上面第一次更新中的方法也是有缺陷的;我仍然在旋转时遇到问题。基本上,如果你使用UISplitViewController,你不应该试图改变主视图控制器(即使你在主视图,例如作为弹出窗口的情况下切换主视图,已经被再次隐藏)。在主视图中调用UINavigationController的内容(,而主视图显示为)看起来好像可以,但除此之外的任何内容都会导致问题出现问题。

技术说明:我认为这些问题源自Apple在处理UI方面的明显弱点:即Apple代码将在UIViews和控制器上调用释放,一旦隐藏或从视图中移除,但稍后如果包含viewcontroller再次显示,发送推迟的消息,如viewDidDisappear到已发布的视图/控制器(在此时可能已被释放)。

+0

UISplitViewController存在大量的缺陷。这看起来是最糟糕的。 iOS SDK 5.1仍然存在这些问题。但是,似乎在此版本中使用UINavigationController作为根主视图的解决方法可以正常工作。 – 2012-05-10 15:24:57

+0

哇,还是那么糟糕,这个迟到了吗?感谢您更新我们Dan。 – occulus 2012-05-10 15:30:01

2

如果有人正在寻找这个问题的解决方案(或一个字左右),我也有类似的问题,在这里工作了:Changing the master view in Split View does not update the popover in portrait

基本上,我用的主视图导航控制器控制器以及该导航控制器内的推/俯视图控制器,以在弹出视图中更改主视图中的视图控制器,同时仍以纵向方式显示正确的视图控制器。

相关问题