45

我有一个简单的 iPhone 应用程序,它有一个标签栏和 3 个标签。每个选项卡都作为带有相应控制器的单独 nib 加载。每个 nib 都包含一个 tableview 以及一些用于搜索/过滤等的其他控件。

我想要(并且似乎找不到示例)是向应用程序添加导航控制器,以便每个笔尖(即每个选项卡)都可以深入了解更多详细信息页面。

我应该将导航控制器添加到主窗口并为其创建一个导航控制器,IBOutlet还是应该将 NC 添加到笔尖。

4

8 回答 8

63

一旦你在 XIB 中有一个标签栏,最简单的方法是将 UINavigationController 对象从库窗口(看起来像金色背景上的左侧导航栏按钮)拖到标签栏的树视图中(仅文本视图,而不是 GUI)。将导航控制器放在标签栏控制器内,然后将现有视图控制器拖到导航控制器内。

当您查看该选项卡时,您应该会在其顶部看到一个导航栏...如果您从另一个 xib 加载导航控制器,您将修改选项卡栏 xib 中的导航栏。

于 2008-12-15T17:42:40.853 回答
27

这是如何以编程方式添加 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];
}
于 2012-02-15T08:30:00.827 回答
13

我意识到这已经很晚了,但是这个问题今天在谷歌搜索结果中排名第一,所以我想我会添加一个答案。O'Reilly 有一个很棒的 youtube 视频教程,它会引导您完成一个标签栏 + 导航控制器应用程序。在这里查看:http ://www.youtube.com/watch?v=LBnPfAtswgw

于 2010-02-12T05:41:40.820 回答
9

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.

于 2008-12-15T18:44:47.857 回答
9

很多答案,但没有检查...

当然,现在使用 Xcode 界面生成器中的故事板,这一切都变得非常简单:

创建感兴趣的导航控制器,然后选择菜单Editor和项目Embed In >,然后Tab Bar Controller

当您从新项目的主/详细拆分视图控制器模板开始时,这甚至适用于 Xcode 为您提供的导航控制器。在这两种情况下,我现在都有一个标签栏控制器作为我的主人;对于 iPhone,它会通过终端控制器一路涟漪,而在 iPad 上,它仅将选项卡保留在主控器中(即横向拆分右侧,纵向弹出框)。

于 2012-04-18T22:12:37.950 回答
1

打开您的 UITabBarController 的 XIB 文件(来自 MainWindow.xib)

转到“标签栏控制器属性”。您将在那里看到一个“视图控制器”部分,其中将提到每个选项卡的视图控制器。只需将控制器的类型更改为您想要的任何选项卡的 NavigationController。

选择您已更改的控制器的视图,并检查其属性中的 loadFromNib 选项,然后选择正确的 nib。(因为更改控制器类型后,此连接将丢失)

于 2011-07-14T10:36:04.717 回答
0

这个问题太老了,但是 SDK 升级了,一些读者可能需要新的答案。所以,现在对于故事板用户来说,同时使用 Tabbar 和 Navigation 控制器的答案非常简单。

  1. 将导航控制器拖动到情节提要内。
  2. 将启动箭头分配给新的导航控制器,使控制器作为起点。
  3. 拖动 Tabbar 控制器并使用选项卡和所需的控制器进行设置。您也可以稍后根据需要设置带有标签的标签栏控制器。
  4. 选择导航控制器并将其“根视图控制器”与标签栏控制器绑定。

这将使用导航和 tabview 控制器加载应用程序。

于 2015-09-30T07:13:46.720 回答