我有一个简单的 iPhone 应用程序,它有一个标签栏和 3 个标签。每个选项卡都作为带有相应控制器的单独 nib 加载。每个 nib 都包含一个 tableview 以及一些用于搜索/过滤等的其他控件。
我想要(并且似乎找不到示例)是向应用程序添加导航控制器,以便每个笔尖(即每个选项卡)都可以深入了解更多详细信息页面。
我应该将导航控制器添加到主窗口并为其创建一个导航控制器,IBOutlet
还是应该将 NC 添加到笔尖。
一旦你在 XIB 中有一个标签栏,最简单的方法是将 UINavigationController 对象从库窗口(看起来像金色背景上的左侧导航栏按钮)拖到标签栏的树视图中(仅文本视图,而不是 GUI)。将导航控制器放在标签栏控制器内,然后将现有视图控制器拖到导航控制器内。
当您查看该选项卡时,您应该会在其顶部看到一个导航栏...如果您从另一个 xib 加载导航控制器,您将修改选项卡栏 xib 中的导航栏。
这是如何以编程方式添加 NavigationController(例如在您的 AppDelegate 中)
UIViewController *viewController1, *viewController2;
viewController1 = [[[UIViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
UINavigationController *navigationcontroller = [[[UINavigationController alloc] initWithRootViewController:viewController1] autorelease];
viewController2 = [[[UIViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigationcontroller, viewController2, nil];
如果您在 Viewcontroller1 中有一个 tableview,您可以通过使用self.navigationController
例如在didSelectRowAtIndexPath
打开 DetailView来访问 Navigationcontroller
例如。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
在此示例中,detailViewController 使用 NIB 文件初始化,该文件添加了带有后退按钮的导航栏。但是,如果您也以detailViewController
编程方式初始化,您可以向 a 添加一个操作 (GoBack) 以从其导航控制器UIBarButtonItem
中删除。detailViewController
-(void) GoBack
{
[self.navigationController popViewControllerAnimated:YES];
}
我意识到这已经很晚了,但是这个问题今天在谷歌搜索结果中排名第一,所以我想我会添加一个答案。O'Reilly 有一个很棒的 youtube 视频教程,它会引导您完成一个标签栏 + 导航控制器应用程序。在这里查看:http ://www.youtube.com/watch?v=LBnPfAtswgw
The way to think about it is this:
You want each tab to have a navigation controller. Then, each nav controller needs to have a root view controller and a loaded Nib.
So, in IB, add nav controllers for each of your tabs. Then, configure each nav controller to have the appropriate root view controller and Nib.
很多答案,但没有检查...
当然,现在使用 Xcode 界面生成器中的故事板,这一切都变得非常简单:
创建感兴趣的导航控制器,然后选择菜单Editor
和项目Embed In >
,然后Tab Bar Controller
。
当您从新项目的主/详细拆分视图控制器模板开始时,这甚至适用于 Xcode 为您提供的导航控制器。在这两种情况下,我现在都有一个标签栏控制器作为我的主人;对于 iPhone,它会通过终端控制器一路涟漪,而在 iPad 上,它仅将选项卡保留在主控器中(即横向拆分右侧,纵向弹出框)。
打开您的 UITabBarController 的 XIB 文件(来自 MainWindow.xib)
转到“标签栏控制器属性”。您将在那里看到一个“视图控制器”部分,其中将提到每个选项卡的视图控制器。只需将控制器的类型更改为您想要的任何选项卡的 NavigationController。
选择您已更改的控制器的视图,并检查其属性中的 loadFromNib 选项,然后选择正确的 nib。(因为更改控制器类型后,此连接将丢失)
这个问题太老了,但是 SDK 升级了,一些读者可能需要新的答案。所以,现在对于故事板用户来说,同时使用 Tabbar 和 Navigation 控制器的答案非常简单。
这将使用导航和 tabview 控制器加载应用程序。