Swift 多个子视图并返回到原始 TableView

Posted

技术标签:

【中文标题】Swift 多个子视图并返回到原始 TableView【英文标题】:Swift multiple subviews and getting back to original TableView 【发布时间】:2018-11-17 19:38:35 【问题描述】:

我创建了自己的 TabView,第一个选项卡始终是 Home 选项卡,其中包含一个 TableView 。其他 3 个选项卡 Search、Menu 和 Inbox 是 subviews 。我可以从

首页搜索然后返回首页,它就可以工作了 首页到菜单然后回到首页,它也可以工作 Home to Menu 然后到 Search 并返回 Home 让我回到 Menu 子视图。我基本上想在单击 Home Tab 时消除所有子视图。每个 TabView 也都在它自己的控制器中。

这是我的代码

从主控制器到菜单控制器

@IBAction func MenuTabAction(_ sender: UIButton) 
    let Popup = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MenuC") as! MenuC

    self.addChildViewController(Popup)
    Popup.view.frame = self.view.frame
    Popup.view.tag = 100
    self.view.addSubview(Popup.view)
    Popup.didMove(toParentViewController: self)


从菜单控制器到主页控制器和搜索控制器

   @IBAction func HomeTabAction(_ sender: UIButton) 
        if let viewWithTag = self.view.viewWithTag(100) 
            print("Tag 100")
            viewWithTag.removeFromSuperview()
        

    

       @IBAction func SearchTabAction(_ sender: UIButton) 

    let Popup = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LocalSearchC") as! LocalSearchC
    Popup.view.frame = self.view.frame
    Popup.view.tag = 100
    self.view.addSubview(Popup.view)
    Popup.didMove(toParentViewController: self)

我猜测删除超级视图一次只删除 1 个超级视图,所以如果我从 Subview1 转到 subview2 然后单击 HomeTab 它会将我带到 subview1 而不是原来的 HomeTab 。单击主页选项卡时有没有办法删除所有超级视图/子视图?

【问题讨论】:

【参考方案1】:

每个选项卡都有自己的视图控制器。理想情况下,您应该 removeFromSuperview 所有未显示的控制器。

在您的代码中,您只能在removeFromSuperView HomeTabAction

尝试改变它:

if let viewWithTag = self.view.viewWithTag(100) 
    print("Tag 100")
    viewWithTag.removeFromSuperview()

for v in self.view.subviews 
    if v.tag == 100 
        v.removeFromSuperview()
    

但是请记住,每次用户按下任何选项卡而不返回主页时(即:在菜单和搜索之间多次点击),看起来您只是在实例化许多控制器,不删除它们。

您应该在每次实例化新视图时删除其他视图。明智的做法是给每个视图控制器一个唯一的标签,并在每次更改后删除隐藏的其他标签,而不仅仅是在返回主页时。或者至少,在创建新视图控制器之前检查是否已经实例化了具有给定类型的视图控制器。

【讨论】:

【参考方案2】:

实际上,您不需要手动实例化视图控制器(LocalSearch、Menu)。 TabViewcontroller 可以通过 segue 将 vc 与每个选项卡项链接起来。事实上,当你将你的 tabvc 添加到项目中时,它会附带 2 个 viewcontroller,每个都连接到 tabview 中的一个项目,就是这样,你只需要替换它们或调整它们,无需“加载”它们。

您需要这样做的唯一情况是,如果您的按钮是“动态的”,例如,要加载的内容会根据其他一些情况而变化。只要点击“搜索”进入LocalSearchViewController,只需将它与情节提要上的segue链接即可。

【讨论】:

以上是关于Swift 多个子视图并返回到原始 TableView的主要内容,如果未能解决你的问题,请参考以下文章

平移手势后将视图返回到原始位置,快速

子视图滚动不起作用 SWIFT

Swift:如果没有导航控制器,如何返回初始视图控制器

返回上一个 ViewController 不适用于 Swift 中的多个视图控制器

如何在 Swift 中的 PDF 上绘制一些东西?

如何在 Swift 中从 Core Data 访问子数据和父数据