将 TabBarController 推送到视图

Posted

技术标签:

【中文标题】将 TabBarController 推送到视图【英文标题】:Push TabBarController to a View 【发布时间】:2011-01-27 14:10:56 【问题描述】:

如何?

该应用程序是基于视图的。在应用程序中,我有一个带有 TabBarController 的 XIB,我想将 TabBar 推到显示器上。我已经做了所有事情,现在我不知道我做错了什么。

这是应该推送 TabBarController 的代码:

- (void)showTabBar 
TabBar *tbc = [[TabBar alloc] initWithNibName:@"TabBar" bundle:nil];
[self presentModalViewController:tbc animated:YES];
[tbc release];

此时,XIB 中有一个空视图。所以当我运行这段代码时显示是白色的。还有我想在显示器上看到的 TabBarController。

感谢您的帮助。


更新:

我应该说这是两个不同的类。函数“showTabBar”所在的类应该推送TabBarController。第二类是TabBar。 TabBar 是 TabBarController 的委托。

所以我修改了这样的答案,但我都尝试了:

[self presentModalViewController:tbc.tabBarController.view animated:YES];

错误现在看起来像这样:

Incompatible Objective-C types 'struct UIView *', expected 'struct UIViewController *' when passing argument 1 of 'presentModalViewController:animated:' from distinct Objective-C type

更新:

嘿,错误已经消失。凉爽的。 ;)

但应用程序正在终止。我以前见过这种行为,但我不知道该怎么做。 调试器控制台这样说:

2011-01-27 15:49:32.629 Touch[3657:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target <StartUp: 0x9300f20>.'

【问题讨论】:

【参考方案1】:

因为 UITabBarController 类继承自 UIViewController 类,所以标签栏控制器有自己的视图,可以通过 view 属性访问。 部署标签栏界面时,必须将此视图安装为窗口的根。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html

这意味着,这不是“允许的”,Apple 可以或可能在未来拒绝您的申请。 UITabBarController 旨在添加到应用程序委托中的根视图(窗口)。如果你想稍后推送一个标签栏,你需要使用 UIToolBar,例如uisegmentedcontrol 或工具栏按钮。

即使某些应用程序会这样做(例如 Wordpress 应用程序),但您稍后会发现在模态显示视图控制器时会在控制台中遇到一些问题。(将给出警告)。

【讨论】:

好的,这是否意味着我必须在没有 TabBarController 的情况下自己构建 TabBar? 据我所知,是的。我对我制作的一个应用程序犯了同样的“错误”,因为编译器不会告诉你推送 UITabBarController 是错误的,所以我认为这没问题,直到我得到帮助并阅读了文档(它会导致其他问题,因为iOS 为您设置的隐式关系与 parentViewController、tabBarController、navigationController)。我所做的是制作一个 UIToolBar,并添加了一个我居中的 UISegmentedControl。但是我也可以使用 UIToolBarItem,它会给你几乎相同的效果。但是,推送/弹出视图的逻辑丢失了。 你会使用普通的 View 来填充构建 TabBar 所需的所有 TabBar 内容吗? 是的,您将创建一个新的视图控制器,从 UIViewController 继承并将组件添加到此视图。 各种控制器都一样吗?也许使用 NavigationController 或 ViewController?如果我想使用它们,是否必须从头开始构建它们?

以上是关于将 TabBarController 推送到视图的主要内容,如果未能解决你的问题,请参考以下文章

当 tabBarController/navController 在同一个应用程序中时,问题推送到详细视图

推送到 UIStoryboard 中的根视图控制器

如何将视图控制器推送到 UISplitViewController

无法将视图推送到 searchResultsController

我可以将视图控制器推送到后端的 UINavigationController

UITableViewController 没有将视图推送到堆栈上