如何将标签栏+导航与XCode结合使用

时间:2009-01-25 22:43:04

标签: objective-c iphone

我正在试图组合一个TabBar +导航应用程序。

我有5个标签栏,4个列出了内容并深入查看详细信息视图。

我尝试按照本教程进行操作:

http://www.iphonedevforums.com/forum/iphone-sdk-development/124-view-controller-problem.html

但总是看到空白。

这就是我所做的,有一个干净的项目:

  • 我从TabBar模板应用开始。
  • 我放了5个标签栏按钮。
  • 我创建了一个控制器,如:

    @interface FirstViewController:UINavigationController {

    }

  • 我将主要的window.xib放在树模式&将所选的第一个视图更改为FirstViewController
  • 我在界面构建器中选择了TabBar控制器,转到TabBar属性&将类更改为导航控制器。
  • 选择第一个视图&将笔尖名称设为“SecondView”

作为回应,我得到一个空白的屏幕。

我必须补充一点,我想从详细信息视图中导航,而不是从主窗口导航。

即在主窗口标签栏1中是人员列表。我选择一个人然后想要导航到详细信息窗口。

5 个答案:

答案 0 :(得分:15)

首先,您永远不想将UINavigationController或UITabBarController子类化。

其次,我并没有完全了解你做了什么,但是在标签栏控制器中创建导航控制器的正确顺序是这样的:

// in MyAppDelegate.h
UINavigationController *nc1, *nc2;
FirstTabRootViewController *vc1;
SecondTabRootViewController *vc2;
UITabBarController *tbc;

// in MyAppDelegate.m
nc1 = [[UINavigationController alloc] init];
vc1 = [[FirstTabRootViewController alloc] initWithNibName:nil bundle:nil];
vc1.tabBarItem.title = @"Tab 1";
vc1.tabBarItem.image = [UIImage imageNamed:@"tab1.png"];
vc1.navigationItem.title = "Tab 1 Data";
nc1.viewControllers = [NSArray arrayWithObjects:vc1, nil];

nc2 = [[UINavigationController alloc] init];
vc2 = [[SecondTabRootViewController alloc] initWithNibName:nil bundle:nil];
vc2.tabBarItem.title = @"Tab 2";
vc2.tabBarItem.image = [UIImage imageNamed:@"tab2.png"];
vc2.navigationItem.title = "Tab 2 Data";
nc2.viewControllers = [NSArray arrayWithObjects:vc2, nil];

tbc = [[UITabBarController alloc] init];
tbc.viewControllers = [NSArray arrayWithObjects:nc1, nc2, nil];

请注意,它是您的视图控制器,用于控制选项卡栏和导航栏中的文本/图标。为每个选项卡创建一个UINavigationController实例; UINavigationController包含一堆视图控制器(请参阅viewControllers属性),它应包含至少一个项目 - 该选项卡的根控制器。还要创建一个UITabBarController来管理选项卡。

当然,您可以(也可能应该)使用接口构建器而不是代码来实例化提到的类并设置属性。但重要的是要了解幕后发生的事情;接口构建器只不过是实例化和设置对象的便捷方式。

希望这有用;如果不是,请改进你的问题。

答案 1 :(得分:2)

仍然获得空白屏幕在实施上述代码后启动应用程序。我在哪里写错了。

  nc1 = [[UINavigationController alloc] init];
  nc2 = [[UINavigationController alloc] init];
  vc1 = [[FirstRootViewController alloc]initWithNibName:@"FirstRootViewController" bundle:nil];
  vc1.tabBarItem.title = @"Item 1";
  vc1.tabBarItem.image= [UIImage imageNamed:@"home.png"];
  vc1.navigationItem.title = @"Tab1 Data";
  nc1.viewControllers = [NSArray arrayWithObjects:vc1,nil];
  vc2 = [[SecondRootViewController alloc]initWithNibName:@"SecondRootViewController" bundle:nil];
  vc2.tabBarItem.title = @"Item 2";
  vc2.tabBarItem.image= [UIImage imageNamed:@"home.png"];
  vc2.navigationItem.title = @"Tab2 Data";
  nc2.viewControllers = [NSArray arrayWithObjects:vc2,nil];
  tbc = [[UITabBarController alloc]init];
  tbc.viewControllers = [NSArray arrayWithObjects:nc1,nc2,nil];
  [window addSubview:tbc.view];
  [window makeKeyAndVisible];

答案 2 :(得分:1)

这是我能够工作的tutorial

我还阅读了有关该主题的官方SDK文档:Combining Tab Bar and Navigation Controllers。因为我还在学习,所以教程对我的帮助不仅仅是文档。

注意:在教程中,我认为你不需要继承UINavigationController,我现在正在尝试这个想法。

答案 3 :(得分:1)

我尝试使用UITabBarController和其中的一些UINavigationController创建一个iphone应用程序,并遇到与“mamcx”相同的问题。使用您的示例代码我可以运行:)非常感谢。

以下是它对我有用的方法。

// YOURS
fourthNavigation = [[UINavigationController alloc ] init ];
fourthViewController = [[[FourthTabRootController alloc] initWithNibName:@"FourthView" bundle:nil] autorelease];
fourthNavigation.tabBarItem.title = @"YOURS";
fourthNavigation.viewControllers = [NSArray arrayWithObjects:fourthViewController, nil];

// Add self-defined UIViewControllers to the tab bar
tabBarController.viewControllers = [NSArray arrayWithObjects:firstNavigation,secondNavigation, thirdNavigation, fourthNavigation, nil];
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];

其他UINavigationControllers“firstNavigation,...”以相同的方式创建。 我从连接到我的子类UIViewController类的nib文件加载视图元素。您不需要在IB中将NavigationBar添加到视图中,因为UINavigationController已经完成了一个。所以你只需要在“initWithNibName”中设置标题

  // The designated initializer. Override to perform setup that is required before the view is loaded.
  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    // Custom initialization
    self.title = @"YOURS";
}
return self;
}

我希望有所帮助。

答案 4 :(得分:0)

查看View Controller Catalog for iOS下的“向标签栏界面添加导航控制器”,逐步介绍如何实现这一目标