Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove views in UIstackview swift

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

like image 294
sunshine Avatar asked Jan 05 '17 11:01

sunshine


People also ask

What is Uistackview?

A streamlined interface for laying out a collection of views in either a column or a row.


2 Answers

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)         }     }      } 
like image 79
Reimond Hill Avatar answered Oct 10 '22 18:10

Reimond Hill


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 
like image 21
Kostas Tsoleridis Avatar answered Oct 10 '22 18:10

Kostas Tsoleridis