Текст кнопки не изменяется при вызове в initController init - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь изменить текст UIButton на основе значений, которые установлены в моем init viewController.

Итак, вот инициализация:

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

Метод установки кнопки:

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

Необходимые значения загружаются в viewModel.

Теперь, когда я вызываю этот метод кнопки в этом init, это не имеет никакого эффекта. Тем не менее, когда я вызываю его в viewDidLoad, он работает.

Код кнопки выглядит следующим образом:

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
    }

Когда я помещаю метод в init, инициализированное значение по умолчанию «Test» показывает на кнопке. Однако, когда я печатаю заголовок кнопки из init и viewDidLoad, сначала вызывается viewDidLoad, который показывает «Test», а затем вызывается init и показывает правильное значение. Если это вызывается после viewDidLoad, почему оно не отражается на пользовательском интерфейсе?

Когда я вставляю метод в viewDidLoad, отображается правильное значение ...

Конечно, я что-то упустил здесь очевидно, но любая помощь приветствуется.

ОБНОВЛЕНИЕ: Я также печатал из viewDidDisappear, и правильное значение печатается, даже когда я вызываю метод из init. Таким образом, свойство устанавливается, но не отображается на кнопке ...

Ответы [ 3 ]

0 голосов
/ 30 января 2020

Ни один из приведенных выше кодов не показывает, что вы на самом деле добавляете кнопку в представление контроллера представления. Трудно сказать, не зная больше, но возможно ли, что вы также создаете и добавляете кнопку в xib и присвоить его свойству button? Это заменит кнопку, которую вы создали в ленивой загрузке.

В качестве альтернативы, есть ли отдельная кнопка, которую вы создаете, но никогда не обновляется?

Как button добавляется в представление контроллера вида?

0 голосов
/ 30 января 2020

В конце я добавил новый аргумент в init: добавил didSet в viewModel:

private var viewModel: ViewModel {
    didSet {
        setInitialButtonText()
    }
}
0 голосов
/ 30 января 2020

Не уверен, что это проблема. Но вы пытались установить название кнопки, используя button.setTitle("myTitle", for: .normal)?

...