未调用UISplitViewController委托方法

问题描述 投票:7回答:3

我在UISplitViewController中使用UITabBarController,在分割视图的主窗格中使用普通的UIViewController,在详细信息窗格中使用UINavigationController,其本身包含香草UIViewController

我知道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'应该这样做时,似乎非常错误。

ipad uisplitviewcontroller uiinterfaceorientation
3个回答
4
投票

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


3
投票

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

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

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

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

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

splitView.delegate = detailView;

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


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.