ios - 从 View Controller 中删除特定的自定义 View 、uiview、textview 等

标签 ios swift

我想做的很简单。首先让我解释一下我所拥有的内容,在 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/

相关文章:

ios - 尝试在 Swift 上使用 EDSunriseSet SDK,但日落时间变得奇怪

ios - iOS 8 应用程序/框架中缺少必需的模块 'CocoaLumberjack'

ios - 当我展示我的 UIImagePickerController 时,什么也没有出现

ios - 如何使用 UserDefaults 从 UIDatePicker 进行存储?

ios - Realm 用 Swift 4.0 编译的 Swift 模块无法在 Swift 4.0.2 中导入

ios - 在 Swift 4 中使用滑动操作删除文件

ios - 在特定 iPad 型号上添加 UIView Laggy

ios - Alpha 不更新 - UIColor

json - 如何在 SwiftUI 中显示来自 API 的 JSON 数据?

ios - 当我创建一个类并调用在该类中创建的方法时,我遇到错误,它在函数中重定向两次并显示 nil