如果在视图控制器中使用 Tabbar,如何设置主视图控制器
Posted
技术标签:
【中文标题】如果在视图控制器中使用 Tabbar,如何设置主视图控制器【英文标题】:How to set homeview controller if use a UITabbar in a viewcontroller 【发布时间】:2018-10-26 12:06:16 【问题描述】:我在视图控制器中添加了一个单独的 UITabbar。制作了所有必要的插座。主视图控制器中有标签栏。我想要什么如果我点击第一个按钮应该没有变化,但如果点击第二个标签栏项目,它应该显示第二个屏幕。
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
switch item.tag
case 1:
if sampleOne == nil
var storyboard = UIStoryboard(name: "Main", bundle: nil)
sampleOne = storyboard.instantiateViewController(withIdentifier: "s1") as! SampleOneViewController
self.view.insertSubview(sampleOne!.view!, belowSubview: self.sampleTabBar)
break
case 2:
if sampleTwo == nil
var storyboard = UIStoryboard(name: "Main", bundle: nil)
sampleTwo = storyboard.instantiateViewController(withIdentifier: "s2") as! SampleTwoViewController
self.view.insertSubview(sampleTwo!.view!, belowSubview: self.sampleTabBar)
break
default:
break
But it loads Homeviewcontroller first then it shows the other viewcontroller.
Now how should i set the homeviewcontroller(which has uitabbar in it) as first viewcontroller.
为了安布的帮助?
【问题讨论】:
为什么你不使用 UITABBarController。它很容易,将节省您的时间 使用UITabBarController with UINavigationcontroller
方便导航。
问题是我想要一个用于库使用的视图控制器,这就是我选择单独的 uitabbar 的原因。现在我想如果按下第一个标签栏,我需要显示主屏幕(其中有标签栏)
不用担心它是 tabbarController 的原生行为。
如果第一个标签栏项目被按下,如何返回主屏幕?
【参考方案1】:
根据文档,如果您想在不同视图之间切换同时保持视图控制器相同,请使用 UITabBar。但是如果你想在不同的视图控制器之间切换,UITabBarController 应该是首选的方式。
在使用 UITabBar 切换视图控制器时可能面临的问题是您需要手动处理很多事情。例如。添加和删除您的子视图控制器。
但如果您仍然坚持这样做,请在您的视图控制器之间使用父子关系。将您的 HomeViewController
设为父视图。现在在viewDidLoad
上假设默认选择第一项,添加 SampleOneViewController 如下:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s1") as? SampleOneViewController
self.addChildViewController(vc)
self.view.insertSubview(vc, belowSubview: tabBar)
现在,在标签栏委托中,您需要先删除以前的子视图控制器,然后再添加索引选择的视图控制器。
所以你的委托方法会变成这样:
func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)
switch item.tag
// Remove the previous child viewcontrollers
for vc in self.childViewControllers
vc.willMove(toParentViewController: nil)
vc.view.removeFromSuperview()
vc.removeFromParentViewController()
case 1:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s1") as? SampleOneViewController
self.addChildViewController(vc)
self.view.insertSubview(vc, belowSubview: self.view)
break
case 2:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "s2") as? SampleTwoViewController
self.addChildViewController(vc)
self.view.insertSubview(vc, belowSubview: self.view)
break
default:
break
希望这会有所帮助。
【讨论】:
可以添加视图,但是 homeviewcontrollers 中的按钮和标签等对象会显示在所有视图中。 那是因为您使用的是 insertSubviews 方法。我认为您必须在 HomeViewController 中添加一个单独的 UIView,创建它的插座,然后不要在 self.view 中插入视图,而是将它们添加到该单独的视图中,确保没有其他按钮或标签遮挡它。 其实我在subview: "self.sample" 下添加其他视图! 检查情节提要中 HomeViewController 的视图层次结构。如果 sampleTabBar 上方有任何内容,它将显示在所有其他视图上,因为您正在将其他视图添加到 sampleTabBar 下方。 谢谢你!一个非常简单的问题,但需要更多时间来解决。感谢您对重新排序的帮助。以上是关于如果在视图控制器中使用 Tabbar,如何设置主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
登录后如何在 swift 4 中使用主视图控制器设置侧边菜单
没有 modal、tabbar 和 navigationcontroller 的 UIViewController 工作流管理?