我想做的很简单。首先让我解释一下我所拥有的内容,在 mainviewcontroller 中,我在开始导航栏、内容和 Bottombtn 处有 3 个主视图。我有一个侧边栏 btn,然后触发主视图 Controller 中的一个函数,每个函数都应该删除中间 View (内容),然后放置一个新的 subview 来代替内容。
问题:它首先起作用,函数删除 contentTxt 并将其替换为新 View 示例之一:connectView,但问题是当我尝试触发另一个函数(比如 addAchievementView())时,它不会删除 connectView,然后添加成就 View ,而不是让在连接 View 下方添加成就 View
我的目标:功能是删除以前的 View (无论哪个 View 正在获取内容位置),然后添加新 View 。有办法解决这个问题吗?或者有更好的方法来做到这一点吗?
这是 mainViewController 代码:
class mainViewController: UIViewController {
let navbar:navbarView = {
let content = navbarView()
return content
}()
let contentTxt:UITextView = {
let content = UITextView()
content.backgroundColor = UIColor.green
content.font = UIFont(name: "copperplate", size: 20)
return content
}()
let bottomBtn:UIButton = {
let content = UIButton()
content.backgroundColor = UIColor.blue
return content
}()
override func viewDidLoad() {
super.viewDidLoad()
navbar.translatesAutoresizingMaskIntoConstraints = false
contentTxt.translatesAutoresizingMaskIntoConstraints = false
bottomBtn.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(navbar)
view.addSubview(contentTxt)
view.addSubview(bottomBtn)
navbar.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
navbar.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
navbar.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
navbar.heightAnchor.constraint(equalToConstant: 50).isActive = true
contentTxt.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
contentTxt.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
contentTxt.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
contentTxt.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
bottomBtn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant:-10).isActive = true
bottomBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
bottomBtn.widthAnchor.constraint(equalToConstant: 70).isActive = true
bottomBtn.heightAnchor.constraint(equalToConstant: 70).isActive = true
}
@objc func addConnectView(){
print("addConnectView")
self.contentTxt.removeFromSuperview()
let connect:connectView = {
let content = connectView()
content.backgroundColor = UIColor.red
return content
}()
connect.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(connect)
self.view.sendSubview(toBack: connect)
connect.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
connect.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
connect.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
connect.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addTemplateView(){
print("addTemplateView")
self.contentTxt.removeFromSuperview()
let content:templateView = {
let content = templateView()
content.backgroundColor = UIColor.blue
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addSettingView(){
print("addSettingView")
self.contentTxt.removeFromSuperview()
let content:settingView = {
let content = settingView()
content.backgroundColor = UIColor.green
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addAchievementView(){
print("addAchievementView")
self.contentTxt.removeFromSuperview()
let content:achievementView = {
let content = achievementView()
content.backgroundColor = UIColor.gray
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addCommandView(){
print("addCommandView")
self.contentTxt.removeFromSuperview()
let content:commandView = {
let content = commandView()
content.backgroundColor = UIColor.cyan
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addListView(){
print("addListView")
self.contentTxt.removeFromSuperview()
let content:commandView = {
let content = commandView()
content.backgroundColor = UIColor.red
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func addNavbarView(){
print("addNavbarView")
self.contentTxt.removeFromSuperview()
let content:navbarListView = {
let content = navbarListView()
content.backgroundColor = UIColor.red
return content
}()
content.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(content)
self.view.sendSubview(toBack: content)
content.topAnchor.constraint(equalTo: navbar.bottomAnchor, constant: 5).isActive = true
content.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
content.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
content.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
@objc func sideController(){
let next = self.storyboard?.instantiateViewController(withIdentifier: "sideViewController") as! sideViewController
self.present(next, animated: true, completion: nil)
}
@objc func profileController(){
let next = self.storyboard?.instantiateViewController(withIdentifier: "profileViewController") as! profileViewController
self.present(next, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
最佳答案
在添加任何 View 之前,请确保删除所有其他 View ,因为您不知道当前显示的内容
self.contentTxt.removeFromSuperview()
self.content.removeFromSuperview() //
self.content.removeFromSuperview() // for settings
这行也是问题
self.view.sendSubview(toBack: content)
默认情况下,添加的 View 放置在父 View 的所有 subview 之上
我投票支持创建 placeHolderView
并在添加之前删除它的 subview ,这将防止知道当前显示的是哪个 subview ,或者您可以为任何添加的 View 添加一个标签,并在任何添加之前执行此操作新添加
self.view.subviews.forEach { if $0.tag == 11 {
$0.removeFromSuperview()
}}
关于ios - 从 View Controller 中删除特定的自定义 View 、uiview、textview 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51446296/