0

我有一系列非常相似的设备,由一个带有三个选项卡的小程序控制。在每个视图控制器中,我使用导航控制器来扩展这些功能的设置。

第一个选项卡“输入”选项卡在这三个设备之间尤其不同,因此当检测到我已经在设备之间切换时,我会在我的应用程序委托中执行以下操作:

if ([self IsCrescendo])
{
    //thirdViewController is really the crescendo'a input view - I need to rename that mess one day
    crescendoInputView = [[ThirdViewController alloc] init : (UIViewController*) currentViewController];
    crescendoInputView.title = [[viewControllers objectAtIndex:INPUT_TAB_INDEX] title];
    crescendoInputView.tabBarItem = [[viewControllers objectAtIndex:INPUT_TAB_INDEX] tabBarItem];
    [viewControllers replaceObjectAtIndex:INPUT_TAB_INDEX withObject:crescendoInputView];
    [crescendoInputView release];
    [self.tabBarController setViewControllers:viewControllers animated:FALSE];

}

if ([self IsSpirito3])
{ // similar to above using obviously a different view controller
}

if ([self IsSonata])
{ // similar to above using obviously a different view controller
}

最初,这个应用程序只控制一个设备,所以当我第一次创建它时,我在主窗口的 XIB 中设置了三个选项卡,效果很好。它默认为原始设备,导航栏完好无损。现在有更多的设备要控制,我想只使用一个 replaceObjectAtIndex 来换一个新的视图控制器,但我的导航栏消失了。

我非常感谢您能对此有所了解。谢谢!

4

1 回答 1

0

好的,经过更多的挠头,以下修复了它:

我最初使用主窗口的 XIB 来实例化三个选项卡。如果您不执行 replaceObjectAtIndex,这可以正常工作。当我执行 ReplaceObjectAtIndex 时,它会丢失导航栏。

相反,如果您以编程方式实例化选项卡,并且每个选项卡都有自己的导航控制器,那么您可以随意替换选项卡,并且不会丢失导航栏等功能。

  • (BOOL)应用程序:(UIApplication *)应用程序 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // 应用程序启动后自定义的覆盖点。

    // 输入视图(默认为 Crescendo)

    UIViewController *viewController1 = [[[ThirdViewController alloc] initWithNibName:@"ThirdView" bundle:nil] autorelease]; UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:viewController1];

    // 卷视图

    UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil] autorelease]; UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

    // 系统视图 UIViewController *viewController3 = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease]; UINavigationController *nav3 = [[UINavigationController alloc] initWithRootViewController:viewController3]; self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.viewControllers = [NSArray arrayWithObjects:nav1, nav2, nav3, nil];

. . }

不确定为什么从 XIB 设置它时它不起作用。我可以发誓我让它在以前的版本上工作,所以也许有什么改变了,苹果忘记告诉我们了。无论如何,我更喜欢这种方法。这不是第一次“像向导一样”的编程工具咬我,所以也许这会节省一些时间。

于 2013-11-05T14:46:50.550 回答