Обновление метки в поле зрения с использованием архитектуры VIPER

Я новичок в VIPER, и я создал самую простую демонстрацию в этой архитектуре, но у меня проблемы, так как UILabel в View / View Controller не обновляется. Это соответствующий код: Просмотр:

    override func viewDidLoad() {
    super.viewDidLoad()
    presenter?.updateView()
}

Ведущий:

func updateView() {
    interactor?.getText()
}

Взаимодействие:

    func getText() {
    presenter?.gotText(text: "Hello Viper")
}

Ведущий:

    func gotText(text: String) {
    view?.updateLabel(text: text)
}

Вид:

func updateLabel (text: String) {
    print(text)
        helloLabel.text = text
}

print (text) возвращает значение, но само представление не обновляется.

Я попытался обновить в основном потоке, но безуспешно. Я видел несколько проектов с аналогичным шаблоном (обновление представления в ViewController / label / backgroundColor и т. Д.), Но я не могу понять, что не так с моим кодом.

Образец доступен на GitHub https://github.com/veliborsantic/VIPER-simple-example Аналогичный проект доступен по адресу https://github.com/smalam119/live-news-viper, который работает должным образом.

РЕДАКТИРОВАТЬ 1: Я понял, что функция viewDidLoad вызывается дважды. Я устанавливаю сообщения печати как в viewDidLoad (), так и в updateLabel (text: String) следующим образом:

override func viewDidLoad() {
     super.viewDidLoad()
     print("viewDidLoad: ", helloLabel.text!)
     presenter?.updateView()
}

func updateLabel (text: String) {
     helloLabel.text = text
     print("updateLabel: ", helloLabel.text!)
}

Outputs:
viewDidLoad:
updateLabel: Hello Viper
viewDidLoad:

Если я удалю конфигурацию для initialViewController в AppDelegate, viewDidLoad вызывается один раз, но модуль не загружается.

РЕДАКТИРОВАТЬ 2 / РЕШЕНО. После исследования мне пришлось сделать 3 вещи: сказать, что я не хочу инициализировать контроллер с помощью раскадровки, поэтому: 1. Отключите «Контроллер начального представления» 2. Отключите главное при развертывании Info и 3. Весь код из AppDelegate перемещается в Scene Delegate в сцене func (_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)


person Velibor Velan Šantić    schedule 01.12.2019    source источник
comment
Не могли бы вы показать свой каркас или способ собрать весь слой модуля Viper   -  person Luis Mejías    schedule 13.12.2019
comment
Вот почему ‹1% программистов на Swift используют VIPER.   -  person liquid    schedule 05.01.2020


Ответы (1)


Просто попробуйте view.layoutIfNeeded () после установки текста

person FindYourBalance    schedule 01.12.2019
comment
Я только что попробовал, никакого прогресса. Для меня это действительно странно. - person Velibor Velan Šantić; 01.12.2019
comment
Хм. просто mb это: view.setNeedsLayout () или view.label.layoutIfNeeded () или плохой способ view.layoutSubviews () - person FindYourBalance; 02.12.2019