web-dev-qa-db-fra.com

Supprimer les vues dans UIstackview swift

Je suis nouveau chez Swift. J'ai ajouté la vue à stackview en utilisant addArrangedSubview(). Mais je ne suis pas en mesure de 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 comme:

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 souhaite que le username & button soit supprimé et ajoute un nouveau champ firstname à la sous-vue.

Est-ce que je le fais de la bonne façon? Comment supprimer une sous-vue? Merci pour toute aide

14
Ahalya

Dans Swift 5.1

la méthode removeArrangedSubview supprime la vue fournie du tableau arrangeSubviews 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 des sous-vues de la pile; par conséquent, la vue est toujours affichée dans le cadre de la hiérarchie des vues.

Pour empêcher la vue d'apparaître à l'écran après avoir appelé la méthode removeArrangedSubview: de la pile, supprimez explicitement la vue du tableau de sous-vues en appelant la méthode removeFromSuperview () de la vue, ou définissez la propriété isHidden de la vue sur true.

Alors:

myStackView.removeArrangedSubview(myView)
myView.removeFromSuperview()
17
Reimond Hill

Si vous souhaitez masquer une vue dans une vue de pile, il vous suffit de définir la propriété cachée de la vue contenue sur true et la vue de pile gère le reste.

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

subview.hidden = true
25
Kostas Tsoleridis

D'après mon expérience, en testant réellement l'implémentation (????), tout ce que vous avez à faire pour supprimer la sous-vue de stackView est d'appeler la méthode removeFromSuperview () sur chaque sous-vue de la stackView:

stackView.subviews.forEach { (view) in
    view.removeFromSuperview()
}

Voici à quoi cela ressemble dans la console:

(lldb) po stackView.arrangedSubviews
▿ 3 elements
  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>
  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>
  ▿ 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>

(lldb) po stackView.subviews
▿ 3 elements
  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>
  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>
  ▿ 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>

Ensuite, vous supprimez toutes les sous-vues:

(lldb) expression stackView.subviews.forEach { (view) in view.removeFromSuperview() }

Et le résultat:

(lldb) po stackView.subviews
0 elements

(lldb) po stackView.arrangedSubviews
0 elements

Vous pouvez faire une extension à UIStackView pour vous faire économiser de la frappe à l'avenir:

extension UIStackView {
    func removeAllSubviews() {
        subviews.forEach { (view) in
            view.removeFromSuperview()
        }
    }
}
2
Roman

Vous êtes sur la bonne voie, mais il y a quelques problèmes avec votre code.

Tout d'abord, vous ne devez appeler self.view.addSubview(mainview) qu'une seule fois, dans mainviewlet. Vous ne devriez pas recommencer dans login et signup.

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

Troisièmement, vos appels à addArrangedSubview et removeArrangedSubview doivent être équilibrés. Vous ajoutez username et button à votre subview mais ne les supprimez jamais. Vous devez les supprimer si vous souhaitez qu'ils disparaissent.

0
Mike Taverne