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

时间:2011-05-02 09:44:24

标签: ipad uisplitviewcontroller launch portrait

我正在做一个基于UISplitViewController的iPad应用程序。当我的应用程序在potrait中启动时,我对toobar按钮有一点问题。不显示显示弹出窗口的按钮。 然而,当我将iPad旋转到横向然后再回到肖像时,按钮显示!

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

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

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

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

6 个答案:

答案 0 :(得分:23)

“Kshitiz”有正确的概念。首先,我在viewDidLoad方法中设置self.splitviewController.delegate = self,设置此委托有点迟。所以,我试图在早期阶段设置委托,这是awakeFromNib方法。然后它运作良好。

所以,问题是在视图已经由viewDidLoad加载之后,那么委托将无法工作,它会在一些活动(如旋转iPad)后工作一段时间。所以比viewDidLoad更早的阶段是awakeFromNib。

以下是有效的代码:

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

答案 1 :(得分:1)

您是否设置了splitviewcontroller委托? 通常,当没有设置委托时会出现问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我遇到了同样的问题,而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;
}

答案 4 :(得分:0)

这也让我很开心,因为我正在开发两个带有开箱即用的splitViewController的iPad项目,第一个总是显示'Master'按钮,而第二个永远不会。我比较了网点,关系和代表,直到我睁大眼睛,但终于在appDelegate找到了答案。原来我在应用程序中注释了一下: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中连接代理,但由于某种原因,它不会没有。故事板设计缺陷,imho。

答案 5 :(得分:0)

我被困在这一段时间了。终于搞定了。 awakeFromNib对我不起作用。 didFinishLaunchingWithOptions做了。可能是因为我正在运行一些填充弹出控制器中的项目的查询。