启动纵向时,UISplitViewController 不显示弹出按钮

Posted

技术标签:

【中文标题】启动纵向时,UISplitViewController 不显示弹出按钮【英文标题】:UISplitViewController not showing popup button when launching portrait 【发布时间】:2011-08-16 20:56:07 【问题描述】:

我正在做一个基于 UISplitViewController 的 iPad 应用程序。当我的应用在 potrait 中启动时,我的工具栏按钮有点问题。不显示显示弹出框的按钮。 但是,当我将 iPad 旋转为横向然后返回纵向时,按钮显示!

看起来启动时没有调用以下方法(这是我有显示按钮的代码):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

该方法在应用启动时不会被调用,只有在旋转时才会调用。更奇怪的是,我使用 Xcode UISplitViewController 模板 + 核心数据制作了一个测试应用程序(这与我正在开发的应用程序相似,并且是我用来制作此应用程序的模板)。在我没有编写任何代码的测试应用程序上,当我以纵向模式启动我的应用程序时,按钮会显示,并且在启动时也会调用上述方法,而不是我的其他应用程序。有没有人有类似的问题?

最后,从苹果文档中并不清楚是否应该在首次显示 UISplitViewController 时调用此方法: http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

【问题讨论】:

请看我对这个问题的回答,可能是重复的:***.com/questions/9411571/… 【参考方案1】:

我也有同样的问题。我的观点是在 IB 中建立的,这似乎是一个时间问题。拆分视图委托在拆分视图通知初始方向“更改”后设置。将拆分视图添加到应用程序委托中的插座使该按钮出现在我的纵向启动时,但是当我打开弹出窗口时它是空的。这可能会以某种方式解决,但我认为拆分视图在设置时没有通知其代表当前方向是很奇怪的。

【讨论】:

【参考方案2】:

我被困在这个问题上已经有一段时间了。终于让它工作了。 awakeFromNib 对我不起作用。 didFinishLaunchingWithOptions 做到了。可能是因为我正在运行一些查询来填充弹出控制器中的项目。

【讨论】:

【参考方案3】:

这也让我省心了,因为我正在使用开箱即用的 splitViewController 处理两个 iPad 项目,第一个总是显示“主”按钮,而第二个从来没有。我比较了outlet和relationships和delegate,直到我被斗鸡眼,但最终在appDelegate中找到了答案。原来我在 application:didFinishLaunchingWithOptions: 中注释得太多了,特别是 splitViewController.delegate 的设置位置。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    

将它添加到 appDelegate 可以让您不必为 splitViewController 子类化。 我也尝试在 IB 中连接代表,但由于某种原因,它不会有这些。故事板设计缺陷,恕我直言。

【讨论】:

【参考方案4】:

“Kshitiz”有正确的概念。首先我在 viewDidLoad 方法中设置了 self.splitviewController.delegate = self,设置这个委托有点晚。因此,我尝试在早期阶段设置委托,即 awakeFromNib 方法。然后效果很好。

所以,问题是viewDidLoad已经加载了view之后,那么delegation就不能工作了,它会在一些活动(比如旋转iPad)之后工作一段时间。所以比 viewDidLoad 更早的阶段是 awakeFromNib。

这是有效的代码:

- (void) awakeFromNib
    [super awakeFromNib];
    self.splitViewController.delegate = self;

【讨论】:

终于!与往常一样,一旦你知道它就会变得如此明显。【参考方案5】:

我遇到了完全相同的问题,Martin Gunnarsson 的回答让我找到了解决方案。

之前,我在 viewDidLoad: 中加载了委托视图(详细视图)之后设置 UISplitViewController 的委托属性。此时,UISplitViewController 已经发送了初始的splitViewController:willHideViewController:withBarButtonItem:forPopoverController: 消息。我只是没有尽快设置委托。

解决方案是在主应用委托中分配委托,application:DidFinishLaunchingWithOptions:。在这种情况下,我的委托包含在导航控制器中,因此我必须更深入地挖掘一层才能获得它。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;

【讨论】:

【参考方案6】:

您是否设置了 splitviewcontroller 委托? 一般没有设置委托时会出现问题。

【讨论】:

是的,我有,但仅限于 IB。它被适当地设置,因为它在随后的方向变化中被调用。是不是觉得因为是在 IB 中设置的,所以在第一次出现视图的时候可以不设置,过一段时间再正确设置。这听起来很疯狂,对我来说几乎是不可能的 您可以随时设置拆分视图控制器的代理。您也可以将代理更改为下一个视图控制器。我已经完成了拆分视图代理的更改,请查看示例希望这会有所帮助。 .kshitizghimire.com.np/… 和 kshitizghimire.com.np/… 我认为从 xib 加载时设置不够及时。

以上是关于启动纵向时,UISplitViewController 不显示弹出按钮的主要内容,如果未能解决你的问题,请参考以下文章

启动纵向时,UISplitViewController 不显示弹出按钮

如何强制 iOS 应用以纵向模式启动

纵向启动问题的 iPad 方向(底部主页按钮)

导航控制器调整大小仅适用于纵向?

如何使用 phonegap 构建同时支持纵向和横向启动屏幕?

SplitViewController 显示细节 iPad Pro 纵向模式