Swift 多个子视图并返回原始 TableView
Swift multiple subviews and getting back to original TableView
我创建了自己的 TabView 第一个选项卡始终是包含 TableView 的 Home 选项卡。其他 3 个选项卡搜索、菜单和收件箱是子视图。我可以从
- 搜索主页然后返回主页即可
- Home to Menu 然后 Back to Home 也能正常工作
- 首页到菜单,然后到搜索,然后返回首页,返回到菜单子视图。我基本上想在单击 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 。单击“主页”选项卡时,有没有办法删除所有 superview/subviews?
每个选项卡都有自己的视图控制器。理想情况下,您应该 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()
}
}
但请记住,每次用户在不返回主页的情况下按任何选项卡(即: 在“菜单”和“搜索”之间点击多次),看起来您只是实例化许多控制器,而不删除它们。
每次实例化新视图时,您都应该删除其他视图。明智的做法是给每个视图控制器一个唯一的标签,并在每次更改后删除隐藏的其他标签,而不仅仅是在返回主页时。或者至少,在创建新视图控制器之前检查给定类型的视图控制器是否已经实例化。
实际上,您不需要手动实例化视图控制器(LocalSearch、Menu)。 TabViewcontrollers 可以通过 segue link a vc 每个选项卡项。事实上,当你将你的 tabvc 添加到项目中时,它会附带 2 个视图控制器,每个视图控制器都连接到 tabview 中的一个项目,就是这样,你只需要替换它们或适配它们,不需要"load" 他们。
您唯一需要这样做的情况是,如果您的按钮是 "dynamic",例如,要加载的内容会根据其他一些情况而改变。只要单击 "Search" 转到 LocalSearchViewController,只需 link 它在故事板上有一个 segue。
我创建了自己的 TabView 第一个选项卡始终是包含 TableView 的 Home 选项卡。其他 3 个选项卡搜索、菜单和收件箱是子视图。我可以从
- 搜索主页然后返回主页即可
- Home to Menu 然后 Back to Home 也能正常工作
- 首页到菜单,然后到搜索,然后返回首页,返回到菜单子视图。我基本上想在单击 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 。单击“主页”选项卡时,有没有办法删除所有 superview/subviews?
每个选项卡都有自己的视图控制器。理想情况下,您应该 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()
}
}
但请记住,每次用户在不返回主页的情况下按任何选项卡(即: 在“菜单”和“搜索”之间点击多次),看起来您只是实例化许多控制器,而不删除它们。
每次实例化新视图时,您都应该删除其他视图。明智的做法是给每个视图控制器一个唯一的标签,并在每次更改后删除隐藏的其他标签,而不仅仅是在返回主页时。或者至少,在创建新视图控制器之前检查给定类型的视图控制器是否已经实例化。
实际上,您不需要手动实例化视图控制器(LocalSearch、Menu)。 TabViewcontrollers 可以通过 segue link a vc 每个选项卡项。事实上,当你将你的 tabvc 添加到项目中时,它会附带 2 个视图控制器,每个视图控制器都连接到 tabview 中的一个项目,就是这样,你只需要替换它们或适配它们,不需要"load" 他们。
您唯一需要这样做的情况是,如果您的按钮是 "dynamic",例如,要加载的内容会根据其他一些情况而改变。只要单击 "Search" 转到 LocalSearchViewController,只需 link 它在故事板上有一个 segue。