未调用UISplitViewController委托方法

时间:2011-01-10 17:34:16

标签: ipad uisplitviewcontroller uiinterfaceorientation

我在UISplitViewController内部使用UITabBarController,在拆分视图的主窗格中使用普通UIViewController,在详细信息窗格中使用UINavigationController,其中包含UIViewController一个香草UISplitViewControllerDelegate

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

我的问题是分割视图的委托方法,即。 // 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

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 会收到轮播通知。

如果我在应用启动开始时强制状态栏方向向右(或向左),使用

,我可以调用 willShowViewController 方法
willHideViewController

但是,- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 不会被调用。而且我不想强迫应用程序从横向开始。如果我做同样的事情但强迫它画像,我不会收到回调。

我不明白为什么拆分视图控制器在其他方面正常运行时没有调用它的委托方法。应该从其方法中调用这些方法 -

{{1}}

内部,当我在其中断点时,我可以检查委托是否已设置并且它仍处于活动状态。

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

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

3 个答案:

答案 0 :(得分:4)

解决了,它必须是根级别或tabBar的直接子视图,它也必须在根级别。讨厌!

答案 1 :(得分:3)

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

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

您在详细视图中实现了委托协议,因此当方向更改时,详细信息视图应该能够在工具栏中放置一个按钮。

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

所以在某个地方,如果你错过了以下的电话,

splitView.delegate = detailView;

detailView将永远不会收到方向更改等通知。至少这是我被卡住的地方。

答案 2 :(得分:2)

我喜欢以下方法从主UIViewController向详细信息UIViewController发送消息。在主人的实现中的某个地方:

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

这是Paul Hegarty 2011年秋季斯坦福iTunesU iPad和iPhone应用程序开发课程。