在详细信息中使用UINavigationController时,可以使用UISplitViewController

时间:2011-05-10 05:40:12

标签: ipad uinavigationcontroller uisplitviewcontroller uitoolbar ipad-2

我正在开发一个iPad / Universal应用程序,我面临着将UINavigationController作为UISplitViewController中的主要详细视图处理的问题。我想知道的是如何在横向方向上将默认侧控制器按钮添加到细节控制器。

定义

拆分视图控制器已经这样定义:

splitViewController = [[UISplitViewController alloc] init];

SideController *root = [[[SideController alloc] init] autorelease];
DetailController *detail = [[DetailController alloc] init];
InserisciDatiController *calcolo = [[[InserisciDatiController alloc]
                                     initWithNibName:@"InserisciDatiNuovi"
                                     bundle:[NSBundle mainBundle]]
                                    autorelease];

UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:root]autorelease];
UINavigationController *calcoloNav = [[[UINavigationController alloc] initWithRootViewController:calcolo] autorelease];

splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, calcoloNav, nil];
splitViewController.delegate = detail;

后来我发布了所有可释放的对象。 我使用SideController作为细节控制器的一种索引。它有一个表视图,单击每一行我更新细节的主视图控制器。每个新控制器始终是UINavigationController的实例。

更新详细信息

myAppDelegate *delegate = (myAppDelegate *)[[UIApplication sharedApplication] delegate];
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex:1];
[nav setViewControllers:[NSArray arrayWithObjects:controller, nil]];

当用户在侧视图控制器中点击一行时,我使用这段代码来更新细节控制器。

处理横向

当我想添加默认工具栏按钮以显示隐藏的侧视图控制器时,我想知道如何处理横向方向。我无法做的是让细节导航控制器的工具栏使用这种方法添加按钮:

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

而且,当我将新控制器推送到导航控制器时,默认的后退按钮将出现在工具栏中。在这种情况下,我应该如何处理按钮创建?

更新

请不要告诉我,没有人遇到过这种问题!你如何开发iPad应用程序?呜咽......

3 个答案:

答案 0 :(得分:1)

我找到了一种对某人有用的方法,尽管我并不认为这是一种处理导航控制器的简洁方法。

在拆分视图控制器委托中,我以这种方式实现了splitViewController:willHideViewController:withBarButtonItem:forPopoverController:方法:

- (void)splitViewController:(UISplitViewController*)svc
     willHideViewController:(UIViewController *)aViewController
          withBarButtonItem:(UIBarButtonItem*)barButtonItem
       forPopoverController:(UIPopoverController*)pc
{
    barButtonItem.title = NSLocalizedString(@"menu", nil);

    myAppDelegate *app = (myAppDelegate *)[[UIApplication sharedApplication] delegate];

    UINavigationController *nav = [app.splitViewController.viewControllers objectAtIndex:1];
    UIViewController *ctrl = [nav.viewControllers objectAtIndex:0];

    if (!ctrl.navigationItem.backBarButtonItem && !ctrl.navigationItem.leftBarButtonItem) {
        ctrl.navigationItem.leftBarButtonItem = barButtonItem;
    }
}

这里我提供了一个条形按钮项目,当前和仅当导航控制器没有显示后退按钮或另一个自定义左按钮项目时,它将显示表示侧视图控制器的弹出视图。

希望这有助于某人!

答案 1 :(得分:0)

我相信Alterplay的Slava Bushtruk已经找到了你想要的东西并在他的APSplitViewController图书馆中使用它。

答案 2 :(得分:0)

我认为你没有得到任何好答案的原因是你很难理解你的问题,即你的问题可能更清楚。 首先让我看看我是否正确理解了这个问题。当您在导航控制器上推送某些东西并且应该同时显示后退按钮和拆分视图按钮时,您不知道如何处理该情况的问题?

如果是这样,我们解决该问题的方式是拆分视图按钮仅在导航控制器的根目录中可见。侧控制器通常仅与详细视图的根视图控制器相关。

如果我误解了您的问题或我的解决方案不适用于您的项目,请告知我们。

编辑:所以,如果你坚持这样做,这是一种方法:

toolbar = [[UIToolbar alloc] initWithFrame:(UIInterfaceOrientationIsPortrait(interfaceOrientation)) ? CGRectMake(0, 0, 768, 44) : CGRectMake(0, 0, 703, 44)];
toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.navigationController.navigationBar addSubview:toolbar];

viewWillDisappear:

[self setToolbarHidden:YES animated:animated];

viewWillAppear:

[self setToolbarHidden:NO animated:animated];

现在您有一个可以添加任何内容的工具栏。好吧,任何可以添加到UIToolbar的东西,几乎都是。