0
votes

Le texte du bouton ne change pas lorsqu'il est appelé dans viewController init

J'essaye de changer le texte d'un UIButton en fonction des valeurs définies dans mon init viewController.

Voici donc l'init:

lazy var button: UIButton = {
    let button = UIButton(title: "Test", color: UIColor.green)
    button.alpha = 1
    return button
}()

init(@escaping buttonAction) {
        super.init(frame: .zero)
        translatesAutoresizingMaskIntoConstraints = false

        stackView.addButtons([button])
        button.pressedAction = buttonAction
    }

Le bouton méthode de réglage:

private func setInitialButtonText() {
    if viewModel.order.measurement.total != nil {
            button.title = "Review"
        } else {
            button.title = "Check"
        }
    }

Les valeurs requises sont chargées dans viewModel.

Maintenant, lorsque j'appelle cette méthode de bouton dans cet init, cela n'a aucun effet. Pourtant, quand je l'appelle dans viewDidLoad, cela fonctionne.

Le code du bouton est le suivant:

init(viewModel: ViewModel, stateMachine: StateMachine) {
    self.viewModel = viewModel
    self.stateMachine = stateMachine
    super.init(nibName: nil, bundle: nil) 
    title = "TEST"
    setInitialButtonText()
}

Quand je mets la méthode dans init, la valeur par défaut la valeur initialisée de «Test» s'affiche sur le bouton. Cependant, lorsque j'imprime le titre du bouton à la fois à partir de init et de viewDidLoad, d'abord celui de viewDidLoad est appelé et affiche «Test» et plus tard, celui d'initialisation est appelé et affiche la valeur correcte. Si cela est appelé après viewDidLoad, pourquoi ne reflète-t-il pas sur l'interface utilisateur?

Lorsque j'insère la méthode dans viewDidLoad, la valeur correcte est affichée ...

Bien sûr que je suis il manque quelque chose d'évident ici, mais toute aide serait appréciée.

MISE À JOUR: J'ai également imprimé à partir de viewDidDisappear et la valeur correcte est imprimée même lorsque j'appelle la méthode depuis init. Donc, la propriété est en cours de définition mais n'est pas affichée sur le bouton ...


0 commentaires

3 Réponses :


0
votes

Je ne sais pas si c'est le problème. Mais avez-vous essayé de définir le titre du bouton en utilisant button.setTitle ("myTitle", pour: .normal) ?


1 commentaires

Malheureusement oui je l'ai fait :(



0
votes

Aucun des codes ci-dessus ne montre que vous ajoutez réellement le bouton à la vue du contrôleur de vue - sans en voir plus, c'est difficile à dire, mais est-il possible que vous soyez également en train de créer et d'ajouter le bouton dans un xib, et l'attribuer à la propriété button ? Cela remplacerait le bouton que vous avez créé dans le chargement différé.

Alternativement, y a-t-il un bouton totalement séparé que vous créez, mais qui n'est jamais mis à jour?

Comment le bouton est-il ajouté à la vue du contrôleur de vue?


1 commentaires

désolé, j'ai ajouté l'init pour les boutons maintenant - et je l'ai compris à la fin, alors je vais poster une réponse



0
votes

À la fin, j'ai ajouté un nouvel argument à l'init comme suit:

private var viewModel: ViewModel {
    didSet {
        setInitialButtonText()
    }
}

Puis dans la variable de bouton:

let button = I6Button(title: reviewFuelSheetButtonTitle, color: UIColor.i6.green)

Et puis enfin dans le viewController j'ai ajouté un didSet sur le viewModel:

init(@escaping buttonAction, buttonTitle: String) {
        self.buttonTitle = buttonTitle
        super.init(frame: .zero)
        translatesAutoresizingMaskIntoConstraints = false

        stackView.addButtons([button])
        button.pressedAction = buttonAction
    }


0 commentaires