2011-01-10 198 views
7

我使用的是UISplitViewController内的UITabBarController与拆分视图的主窗格纯UIViewController和在细节窗格,它本身含有香草UIViewController一个UINavigationControllerUISplitViewController委托方法不叫

我知道Apple建议仅​​在根级别使用拆分视图,但是我已经看到其他应用程序(例如,亚马逊 - “愿望清单”选项卡)在选项卡中使用拆分视图,所以我相信这是可能的。

我的问题是,拆分视图的委托方法,即。 UISplitViewControllerDelegate中的那些不会被调用,这会阻止我在切换到纵向模式时创建我的弹出式菜单。

有问题的方法有以下几种 -

// Called when a button should be added to a toolbar for a hidden view controller 
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc; 

// Called when the view is shown again in the split view, invalidating the button and popover controller 
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem; 

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers. 
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController; 

UISplitViewController确实收到旋转通知。

我能到被称为willShowViewController方法,如果我强迫状态栏取向在应用程序启动之初景观右(或左),使用

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 

然而,willHideViewController没有按不会打电话。我不想强制应用程序开始景观。如果我做同样的事情,但强迫它肖像,我没有收到回调。

我不明白为什么分割视图控制器没有调用它的委托方法,否则它的行为是正确的。这些方法应该从它的方法 - 被称为

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

内部,当我断点在这里面,我可以检查委托设置,它仍然活着。

一直呆在这一整天!其他一切都很好,我很高兴splitview/tabbar/navbar组合运行良好。我只需要这些通知。

我应该在旋转时手动调用它们吗?当'UISplitViewController'应该这样做时,似乎非常错误。

回答

4

解决了,它必须位于根级或tabBar的直接子视图,该视图条也必须位于根级别。烦!

+0

你好, 你介意一点点进一步阐述您的解决方案? 我现在有同样的问题。我有一个tabcontroller至少有3个选项卡的分割视图。我将每个splitview中的detailview添加到一个代表splitview的自己的子类导航控制器中。这对于目前可见的选项卡来说是完美的,但对于其他选项则不是。所以当我旋转我的视图,并更改选项卡它看起来都搞砸了,直到我旋转它。再次,然后只为可见的看法。 – 2011-02-09 17:07:01

+0

嗯抱歉,我不确定..我敢肯定我在这里看过一篇文章,指出在splitview选项卡和旋转之间更改会导致问题,并且splitviwe应始终处于窗口级别 - 甚至不会在标签控制器。我猜想这是由文档支持的。我实际上是从零开始构建自己的SplitView,因为我需要水平分割 – Sam 2011-02-09 22:29:37

3

首先,试着看看你是否设置了正确的代表。 例如,假设你创建了三个控制器,

UISplitViewController* splitView; 
UIViewController* masterView; 
UIViewController* detailView; 

您实现了委托协议的详细视图,这样,当方向的变化,详细视图应该能够把一个按钮在工具栏中。

现在为了使splitView从代理调用此函数,您需要设置委托本身。

所以某个地方,如果你错过下面的调用,

splitView.delegate = detailView; 

的DetailView的将永远不会得到通知的方向变化等。至少这是我被卡住了。

另一种选择是查看下面的链接。它也有一个完整的工作代码,虽然经过一番审查后,它可能比你需要的东西有点多,但是嘿,这是一个已经工作的代码,所以应该让你快点。

http://www.noorselijster19.com/2011/03/ios/combine-tabbar-and-splitview/

2

我喜欢从主UIViewController中对细节的UIViewController发送消息的以下方法。某处主人的里面执行:

id detailViewController = [[self.splitViewController viewControllers] lastObject]; 
[detailViewController setSomeProperty:…]; 

这是保罗·赫加蒂的2011年秋季斯坦福iTunesU iPad和iPhone应用程序开发过程。