SwiftUI View не обновляется для отражения изменений данных в UIViewController - PullRequest
1 голос
/ 22 апреля 2020

Я экспериментировал с SwiftUI и UIKit, пытаясь понять, как данные распределяются между двумя платформами, и я создал простой пример для более крупного проекта, над которым я работаю. Примером является одно представление SwiftUI, которое содержит UIViewControllerRepresentatable, оборачивающий пользовательский контроллер представления. Я пытаюсь, чтобы представление SwiftUI отображало значение одного из свойств контроллера представления, но оно не правильно обновляет sh при изменении значения.

struct ContentView: View {
    @State var viewController = MyViewControllerRepresentable()
    var body: some View {
        VStack {
            viewController
            Text("super special property: \(viewController.viewController.data)")
        }
    }
}
class MyViewController: UIViewController, ObservableObject {
    @Published var data = 3

    override func viewDidLoad() {
        let button = UIButton(type: .system)
        button.setTitle("Increase by 1", for: .normal)
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        view = button
    }

    @objc func buttonPressed() {
        data += 1
    }
}


struct MyViewControllerRepresentable: UIViewControllerRepresentable {
    @ObservedObject var viewController = MyViewController()

    func makeUIViewController(context: Context) -> UIViewController {
        return self.viewController
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}

Когда я запускаю приложение и нажмите кнопку, я вижу, что фактическое значение data меняется, и издатель в MyViewController срабатывает, но значение, отображаемое на экране, не обновляется, чтобы отразить это.

Пожалуйста, обратите внимание, я очень новичок в iOS разработке, и это, вероятно, нетрадиционная модель данных. Однако я не понимаю, почему это не должно работать правильно. Буду весьма признателен за предложения о лучшем способе обмена данными, но я бы прежде всего хотел узнать, возможно ли добиться этого с его текущей структурой данных.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете создать @Binding. Это означает, что когда значение обновляется для data, представления воссоздаются для отражения изменений.

Вот как это можно сделать:

struct ContentView: View {

    @State private var data = 3

    var body: some View {
        VStack {
            MyViewControllerRepresentable(data: $data)
            Text("super special property: \(data)")
        }
    }
}


class MyViewController: UIViewController {

    @Binding private var data: Int

    init(data: Binding<Int>) {
        self._data = data
        super.init(nibName: nil, bundle: nil)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    override func viewDidLoad() {
        let button = UIButton(type: .system)
        button.setTitle("Increase by 1", for: .normal)
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        view = button
    }

    @objc func buttonPressed() {
        data += 1
    }
}


struct MyViewControllerRepresentable: UIViewControllerRepresentable {

    @Binding var data: Int
    private let viewController: MyViewController

    init(data: Binding<Int>) {
        self._data = data
        viewController = MyViewController(data: data)
    }


    func makeUIViewController(context: Context) -> UIViewController {
        viewController
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...