I am new to swift. I have added view to stackview using addArrangedSubview()
. But I am not able to remove this view using removeArrangedSubview()
. Even after removing arranged subView the view is still present
import Foundation import UIKit class render: UIViewController { let subview = UIStackView() let mainview = UIStackView() override func viewDidLoad() { super.viewDidLoad() self.mainviewlet() self.login() } func login() { let username = UITextField() // text field let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40)) //button // Adding to subview subview.axis = UILayoutConstraintAxis.vertical subview.distribution = UIStackViewDistribution.equalSpacing subview.alignment = UIStackViewAlignment.center subview.spacing = 16.0 subview.addArrangedSubview(username) subview.addArrangedSubview(button) subview.translatesAutoresizingMaskIntoConstraints = false; // Adding subview to another stackview mainview.addArrangedSubview(subview) self.view.addSubview(mainview) }
In another function I am removing the arranged subview
func signup(sender: UIButton!) { // Remove subview mainview.removeArrangedSubview(subview) subview.removeFromSuperview() let firstname = UITextField() firstname.textAlignment = NSTextAlignment.center firstname.textColor = UIColor.black firstname.frame = CGRect() firstname.frame.size.height = 30; firstname.text = "firstname" subview.addArrangedSubview(firstname) mainview.addArrangedSubview(subview) self.view.addSubview(mainview) }
and my mainview is created as:
func mainviewlet { mainview.axis = UILayoutConstraintAxis.vertical mainview.distribution = UIStackViewDistribution.equalSpacing mainview.alignment = UIStackViewAlignment.center mainview.spacing = 16.0 mainview.translatesAutoresizingMaskIntoConstraints = false; self.view.addSubview(mainview) }
I want the username
& button
to be deleted and add new field firstname
to the subview.
Am I doing it the right way ? How to delete subview ? Thanks for any help
A streamlined interface for laying out a collection of views in either a column or a row.
In Swift 5.4
removeArrangedSubview method removes the provided view from the stack’s arrangedSubviews array. The view’s position and size will no longer be managed by the stack view. However, this method does not remove the provided view from the stack’s subviews array; therefore, the view is still displayed as part of the view hierarchy.
To prevent the view from appearing on screen after calling the stack’s removeArrangedSubview: method, explicitly remove the view from the subviews array by calling the view’s removeFromSuperview() method, or set the view’s isHidden property to true.
So:
myStackView.removeArrangedSubview(myView) myView.removeFromSuperview()
Extended If you have a series of arranged subview, and you want to clean them, You can also create an extension:
extension UIStackView { func removeFully(view: UIView) { removeArrangedSubview(view) view.removeFromSuperview() } func removeFullyAllArrangedSubviews() { arrangedSubviews.forEach { (view) in removeFully(view: view) } } }
If you want to hide a view within a stack view, all you have to do is set the contained view’s hidden property to true and the stack view handles the rest.
So what you must call as far as I understood from your code is the following:
subview.hidden = true
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With