Изменить содержимое представления из UISceneDelegate - PullRequest
1 голос
/ 04 апреля 2020

У меня есть следующий вид.

struct ContentView: View {
@State var data = "Intitial Value"

var body: some View {
    VStack {
        Text(data)
        Button(action: { self.data="Changed value" }) {
            Text("Click Here")
        }
    }
}
}

Этот простой код работает нормально, когда я нажимаю кнопку, свойство данных, которое оно отображает на метке экрана.

Теперь я хочу изменить текстовая метка всякий раз, когда я получаю URL, а следующий код не работает.

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let vc = self.window?.rootViewController as? UIHostingController<ContentView> else  {
        return
    }
    vc.rootView.data = "Scene Delegate"
}

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете сделать это, используя представление модели, введенное через EnvironmentObject

class DataViewModel: ObservableObject {
    @Published var data = "Intitial Value"
}

struct ContentView: View {
    @EnvironmentObject var vm: DataViewModel       // < declare
    var body: some View {
        VStack {
            Text(vm.data)                          // < use
            Button(action: { 
                self.vm.data="Changed value"       // < use
            }) {
                Text("Click Here")
            }
        }
     }
}

и в SceneDelegate, иметь это как член

class SceneDelegate {
   var dataVM = DataViewModel()         // << create

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
      ...

       let contentView = ContentView()
                             .environmentObject(dataVM)     // << inject
        window?.rootViewController = UIHostingController(rootView: contentView)
      ...
    }


    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        dataVM.data = "Scene Delegate"     // << modify
    }

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