UITabBar和超过1个UINavigationController

时间:2009-07-21 15:37:28

标签: iphone uinavigationcontroller uitabbarcontroller

我正在开发一个应用程序,要求我有不同的UINavigationControllers - 所以我使用标签栏和尝试使用UITabBar在它们之间交换所以我在应用程序中像这样委托一些代码:

// Setting up the views for the tab controller
Friends *friends = [[[Friends alloc] initWithNibName:@"Friends" bundle:[NSBundle mainBundle]] autorelease];
WifiManager *wifi = [[[WifiManager alloc] initWithNibName:@"WifiManager" bundle:[NSBundle mainBundle]] autorelease];

UINavigationController *locationController = [[UINavigationController alloc] initWithRootViewController:wifi];      
UINavigationController *friendsController = [[UINavigationController alloc] initWithRootViewController:friends];

//Set up the tab controller
tabBarController = [[UITabBarController alloc] init];

tabBarController.viewControllers =
[NSArray arrayWithObjects:locationController, friendsController, nil];

//Add the tab bar to the window
[window addSubview:tabBarController.view];

这将编译并将加载第一个UINavigationController,但当我点击另一个导航控制器时,我得到:

*** -[NSCFData tabBarItem]: unrecognized selector sent to instance 0x1152b0'

最奇怪的部分是我可以使用带有单个UINavigationController的标签控制器,一切正常,但是当我尝试添加第二个时它会失败 - 任何人都有任何关于我做错的想法这里吗?

提前谢谢

詹姆斯

3 个答案:

答案 0 :(得分:3)

您是否确认每个单视图控制器(Friends和WifiManager)只有一个时可以工作?可能是你的问题不是“两个控制器”,而是“一个控制器坏了。”

答案 1 :(得分:0)

我有一个以类似方式工作的应用程序。我处理这个问题的方法是将它抽象出来。也就是说,让顶级(低于默认窗口和东西)只是标签栏控制器。我建议在这里派生一个自定义类,以便您可以获得代码。然后让每个导航栏控制器驻留在该标签栏内(在nib结构内),但只担心在显示它们时添加它们。

使用Interface Builder:使用IB非常简单。在我的MainWindow.xib文件中,顶层有所有正常的东西,Window,通用的UITabBarController和UIViewControllers,我想把它们推到每个UINavigationController上,我们会说UIViewController 1b和2b(1a和2a是两个UIViewControllers,是每个相应导航栏的默认视图)。嵌套在UITabBarController中,我有UITabBar和我的两个UINavigationControllers。在每个中,我有一个UINavigationBar,一个UIViewController和一个UITabBarItem。这是我的代码在app delegate中的样子:

[window addSubview:tabBarController.view];
[tabBarController setSelectedIndex:0];

然后当我想使用导航栏时,我这样做:

UIViewController* newView = [[UIViewController alloc]initWithNibName:@"newViewController" bundle:nil];
[self.navigationController pushViewController:newView animated:TRUE];
[newView release];

这就是我需要它才能工作(我可能忘记了一些IB接线)。

我最后的想法是捆绑包可能会弄乱你的导航栏。我从来没有使用它,也不太了解利弊,但你可能会尝试杀死它,看看它是否是一个修复,至少是暂时的。

答案 2 :(得分:0)

该代码应该有效。

我唯一能想到的建议是不自动释放您正在创建的视图控制器。