详细使用 UINavigationController 时的景观 UISplitViewController
Posted
技术标签:
【中文标题】详细使用 UINavigationController 时的景观 UISplitViewController【英文标题】:Landscape UISplitViewController when using a UINavigationController in the detail 【发布时间】:2011-05-10 05:40:12 【问题描述】:我正在开发一个 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 应用程序?呜呜呜……
【问题讨论】:
【参考方案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;
这里我展示了当且仅当导航控制器不显示后退按钮或其他自定义左按钮项目时,将显示代表侧视图控制器的弹出视图的条形按钮项目。
希望这对某人有所帮助!
【讨论】:
【参考方案2】:我相信 Alterplay 的 Slava Bushtruk 已经找到了您正在寻找的东西,并在他的 APSplitViewController 库中使用了它。
【讨论】:
嗯,这不是一个适合我的解决方案。在他的实现中,他总是让两个控制器都可见,而不关心方向。不同的是,我希望侧控制器在纵向模式下隐藏,但我也想知道处理工具栏中的后退按钮和侧控制器按钮的最佳解决方案是什么...... 对了,谢谢提示!它可能对其他项目有帮助! @marzapower 啊,很抱歉,显然我只关注了您问题的一部分。 链接不再可用!【参考方案3】:我认为您没有得到任何好的答案的原因是很难理解您的问题,即您的问题可能更清楚。 所以首先让我看看我是否正确理解了这个问题。当您在导航控制器上按下某些东西并且应该同时显示后退按钮和拆分视图按钮时,您是否不知道如何处理这种情况?
如果是这样,我们解决该问题的方法是拆分视图按钮仅在导航控制器的根目录中可见。无论如何,侧控制器通常只与详细视图的根视图控制器相关。
如果我误解了您的问题或我的解决方案不适用于您的项目,请告诉我。
编辑:因此,如果您坚持这样做,这里有一种方法:
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
,这几乎是任何东西。
【讨论】:
你已经正确理解了这个问题。您在这里建议的是我尝试做的,并且几乎完成了。我真的很想了解是否有一种方法可以显示 both 按钮。 @marzapower 当然可以,但是将这些按钮放在一起会不会很奇怪?我也认为将按钮放在右侧会很奇怪。不奇怪的是,当后退按钮可见时根本不显示该按钮。你不同意吗? 但是你在这里的建议已经被我的回答解决了,不是吗?此外,我有一个视图控制器,它的根控制器已经在左侧显示了一个按钮(垃圾桶)。如何在其中放置多个图标? @marzapower 我已经用可以回答您问题的解决方案更新了答案。我可以向你保证它是有效的,我之前没有分享这个的唯一原因是我想确保这真的是你想要的。 @marzapower,只是一个旁注。如果你在一小时内奖励赏金,我将创造一个新的个人记录,即一天获得的最多声望。如果你能做到这一点,你会成为我的一天。 :)以上是关于详细使用 UINavigationController 时的景观 UISplitViewController的主要内容,如果未能解决你的问题,请参考以下文章