在标签栏中的同一标签上切换视图而不使用导航控制器

Posted

技术标签:

【中文标题】在标签栏中的同一标签上切换视图而不使用导航控制器【英文标题】:Switch views on the same tab in a tab bar WITHOUT using a navigation controller 【发布时间】:2011-08-23 17:06:15 【问题描述】:

我正在寻找一种将标签容器中的当前视图切换到另一个视图的方法,所有视图都在同一个标​​签中,并且不使用导航控制器。

我尝试过这样的事情:

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];

无济于事。

有什么想法吗?

【问题讨论】:

在你的第二个例子中,self 是根视图控制器还是其他一些视图控制器? 当我运行第二个示例时,看起来self 是活动选项卡的实际视图容器,.view 最终成为活动视图。我认为是这种情况,因为代码实际上从容器中删除了视图并使 tabBar 保持不变,但它并没有用新的视图替换视图。 它不会取代它,因为[self.view addSubview:..] 将它添加为视图的子视图您刚刚从屏幕上删除了。您必须交换一些常见超级视图的子视图。但是我不确定(根据您的代码)执行此操作的正确方法是什么。 是的,我不确定第二种方法是否是正确的方法,所以我同意从超级视图中删除该视图并尝试在其位置添加一些东西是违反直觉的。 不,我认为这正是你应该做的,但这不是你正在做的。在您发布的代码中,您要从屏幕上删除视图,然后将新视图放入其中,这没有意义。 【参考方案1】:

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

viewControllers - 我在视图控制器之间切换的 NSArray selectedIndex - 在 vi​​ewLoad 上设置为 0 的选定视图控制器的索引。这是非原子的,因此当调用 setSelectedIndex 时,它会执行所有逻辑来放置该子视图控制器。 selectedViewController - 一个只读属性,以便其他类可以确定当前显示的内容

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

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

这非常有效,但是因为我想为整个应用程序使用一个导航控制器,所以我决定使用不同的方法。

我忘了提到每次添加子视图控制器时都需要清除子视图控制器,这样就不会堆积大量子视图控制器并浪费内存。在上面的块调用之前:

for (UIViewController *viewController in [self childViewControllers])
    [viewController removeFromParentViewController];

【讨论】:

以上是关于在标签栏中的同一标签上切换视图而不使用导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

根据标签栏索引更改视图控制器的属性?

标签栏 UIViewController 中导航栏中的按钮未显示

切换视图时标签栏丢失

如何使用新数据重新加载或刷新选项卡栏控制器的选项卡栏中的数据?

标签栏导航栏中的后退按钮

如何从标签栏视图控制器切换到另一个作为导航控制器子视图的视图