Как обновить состояние представления SwiftUI извне (например, UIViewController) - PullRequest
0 голосов
/ 22 июня 2019

У меня есть представление SwiftUI:

struct CatView : View {

    @State var eyesOpened: Bool = false

    var body: some View {
       Image(uiImage: eyesOpened ? #imageLiteral(resourceName: "OpenedEyesCat") : #imageLiteral(resourceName: "ClosedEyesCat"))
    }
}

Я пытаюсь интегрировать его с обычным UIViewController.

let hostingVC = UIHostingController<CatView>(rootView: cat)
addChild(hostingVC)
view.addSubview(hostingVC.view)
hostingVC.view.pinToBounds(of: view)

Теперь в UIViewController, если я пытаюсь установить свойство eyesOpened, я получаю

Thread 1: Fatal error: Accessing State<Bool> outside View.body

Как мы должны сделать эту работу?Разве представления SwiftUI не должны работать в этом сценарии?

Ответы [ 2 ]

1 голос
/ 23 июня 2019

@ State - это неправильная вещь для использования здесь.Вам нужно будет использовать @ ObjectBinding .

@ State: Используется, когда изменения происходят локально в вашем представлении SwiftUI - т.е. вы изменяете глаза, открытые с помощью переключателя или кнопки и т. Д. В представлении SwiftUI самостоятельно.,

@ ObjectBinding: Связывает ваше представление SwiftUI с внешним источником данных - т.е. входящим уведомлением или изменением в вашей базе данных, чем-то внешним на ваш взгляд SwiftUI.

Я настоятельно рекомендую вам посмотреть следующее WWDC видео - Поток данных через SwiftUI

0 голосов
/ 22 июня 2019

Существует нечто, называемое центром уведомлений, которое вы можете использовать. Короче говоря, это способ, которым представления могут обмениваться данными друг с другом, фактически не изменяя что-либо друг в друге.

Как это работает, представление A отправляет уведомление в центральный концентратор, из которого представление B слышит упомянутое уведомление. Когда представление B слышит уведомление, оно активируется и вызывает функцию, определенную пользователем.

Для более подробного объяснения вы можете обратиться к: https://learnappmaking.com/notification-center-how-to-swift/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...