0

我目前正在开发一个应用程序,该应用程序需要我有不同的 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 一起使用,并且一切正常,但是当我尝试添加第二个时,它惨遭失败 - 有没有人知道我在这里做错了什么?

先感谢您

詹姆士

4

3 回答 3

3

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

于 2009-07-21T22:24:52.910 回答
0

我有一个以类似方式工作的应用程序。我处理这个的方法是把它抽象一点。也就是说,让顶层(默认窗口和东西下面)只是标签栏控制器。我建议在这里派生一个自定义类,以便您可以获取代码。然后让每个导航栏控制器驻留在该选项卡栏内(在笔尖结构内),但只担心在显示时添加它们。

使用 Interface Builder:使用 IB 非常简单。在我的 MainWindow.xib 文件中,顶层包含所有正常的东西,窗口、通用 UITabBarController 和我希望推送到每个 UINavigationController 上的 UIViewController,我们会说 UIViewController 1b 和 2b(1a 和 2a 是两个 UIViewController是每个导航栏的默认视图)。嵌套在 UITabBarController 中,我有 UITabBar 和我的两个 UINavigationControllers。在每一个中,我依次有一个 UINavigationBar、一个 UIViewController 和一个 UITabBarItem。这是我的代码在应用程序委托中的样子:

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

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

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

这就是我让它工作所需的一切(我可能忘记了一些 IB 接线)。

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

于 2009-07-21T15:50:17.450 回答
0

该代码应该可以工作。

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

于 2009-07-21T18:33:10.460 回答