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