2011-08-23 49 views
0

我寻找一种方式来切换当前视图中一个标签容器到另一个,所有相同的选项卡内和不使用导航控制器。开关在一个标签栏同一标签上的观点不使用导航控制器

我已经试过这样的事情:

FooViewController *fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:nil]; 
self.view.window.rootViewController.view.window.rootViewController = fooViewController; 
[fooViewController release]; 

这:

FooViewController *fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:nil]; 
[self.view removeFromSuperview]; 
[self.view addSubview:fooViewController.view]; 
[fooViewController release]; 

无济于事。

任何想法?

+0

在第二个例子中,是'self'根视图控制器或一些其它视图控制器? – jtbandes

+0

当我运行第二个示例时,它看起来像'self'是活动选项卡的实际视图容器,'.view'最终成为活动视图。我认为是这种情况,因为代码实际上从容器中移除了视图,并将tabBar留下,但它不会替换新视图。 – AngeloS

+0

它不会取代它,因为'[self.view addSubview:..]'将它添加为视图*的子视图,您只需从屏幕*中删除该视图。你将不得不交换一些常见的超级视图的子视图。然而,我不确定(给你的代码)什么是正确的方法来做到这一点。 – jtbandes

回答

2

我使用的方法是创建一个UIViewController的子类,我用它作为3个子视图控制器的根视图。根控制器的显着性质是:

  • viewControllers - 视图控制器的一个NSArray我
  • 的selectedIndex之间切换 - 被设置为0上viewLoad所选视图控制器的索引。这是非原子的,所以当setSelectedIndex被调用时,它完成了将该子视图控制器放置到位的所有逻辑。
  • selectedViewController - 一个只读属性,以便其他类可以决定哪些是当前显示

在你需要使用类似的逻辑来的setSelectedIndex方法:

[self addChildViewController: selectedViewController]; 
[[self view] addSubview: [selectedViewController view]]; 
[[self view] setNeedsDisplay]; 

这确实效果不错,但因为我想为整个应用程序使用单个导航控制器,所以我决定使用不同的方法。

我忘了提及你会希望清除子视图控制器,每次你添加一个,这样你就不会堆积大量的内存和浪费内存。上述呼叫中的块之前:

for (UIViewController *viewController in [self childViewControllers]) 
    [viewController removeFromParentViewController]; 
相关问题