43 votes

Supprimer les vues dans UIstackview swift

Je suis nouveau sur swift. J'ai ajouté une vue à stackview en utilisant addArrangedSubview() . Mais je ne parviens pas à supprimer cette vue à l'aide de removeArrangedSubview() . Même après avoir supprimé la sous-vue arrangée, la vue est toujours présente.

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)

}

Dans une autre fonction, je supprime la sous-vue arrangée

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)
}

et ma vue principale est créée en tant que :

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)
}

Je veux que le username & button à supprimer et ajouter un nouveau champ firstname à la vue secondaire.

Est-ce que je m'y prends de la bonne manière ? Comment supprimer une sous-vue ? Merci de votre aide

66voto

Reimond Hill Points 2

Dans Swift 4.2

La méthode removeArrangedSubview supprime la vue fournie du tableau arrangedSubviews de la pile. La position et la taille de la vue ne seront plus gérées par la vue de la pile. Cependant, cette méthode ne supprime pas la vue fournie du tableau subviews de la pile ; par conséquent, la vue est toujours affichée en tant que partie de la hiérarchie des vues.

Pour éviter que la vue n'apparaisse à l'écran après l'appel de la méthode removeArrangedSubview : de la pile, supprimez explicitement la vue du tableau des vues secondaires en appelant la méthode removeFromSuperview() de la vue, ou donnez la valeur true à la propriété isHidden de la vue.

Ainsi :

myStackView.removeArrangedSubview(myView)
myView.removeFromSuperview()

36voto

Kostas Tsoleridis Points 509

Si vous souhaitez masquer une vue dans une vue en pile, il vous suffit de définir la propriété hidden de la vue contenue sur true et la vue en pile s'occupe du reste.

Ce que vous devez appeler, d'après ce que j'ai compris de votre code, est donc le suivant :

subview.hidden = true

0voto

Mike Taverne Points 56

Vous êtes sur la bonne voie, mais votre code pose quelques problèmes.

Tout d'abord, vous ne devez appeler que self.view.addSubview(mainview) une fois, en mainviewlet . Vous ne devriez pas refaire cela en login y signup .

EDIT : suppression du deuxième commentaire car il était incorrect.

Troisièmement, vos appels à addArrangedSubview y removeArrangedSubview doit être équilibrée. Vous ajoutez username y button à votre subview mais sans jamais les retirer. Vous devez les supprimer si vous voulez qu'ils disparaissent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X