SwiftUI, изменение вида со сцены (: продолжить

В приложении SwiftUI я столкнулся с новой проблемой и надеюсь, что кто-нибудь может дать мне несколько советов или рекомендаций. Механизмы, которые я видел до сих пор для связи между частями приложения, здесь не подходят. Но, вероятно, это из-за моего ограниченного опыта работы с SwiftUI.

Сначала соответствующий код:

class SceneDelegate {
  ... lot of code irrelevant to the question ...
  func scene(_ scene: UIScene, 
             continue userActivity: NSUserActivity) {
      ... useful things happening for the app ...
      // Now the view should change ... by some mechanism.
      // This is the point of the question.
  }
}

а также:

struct ContentView: View {
    ... lot of code irrelevant to the question ...
    var body: some View {
        VStack {
          ... code to draw the view ...
        }
        ... more code to draw the view ...
    }
}

Во-вторых, мой вопрос: как мне заставить мое представление перерисовываться после того, как обработка была выполнена внутри scene (: continue?

Я имел в виду некоторые идеи, как делать в функции scene (: continue), что повлияет на прорисовку вида.

К сожалению, при попытке реализовать я понял, что код, отрисовывающий представление, был выполнен до функции scene (: continue. Поэтому мне нужен какой-то другой механизм (например, уведомления, привязки, например, или ??), чтобы иметь вид перерисован.

Есть ли что-то хорошее или стандартный?


person Michel    schedule 14.08.2020    source источник
comment
Реализуйте корневое представление (которое находится над вашим ContentView), которое отображает некоторое состояние загрузки до .onReceive или до тех пор, пока не изменятся некоторые переменные среды, а затем он отобразит ContentView   -  person New Dev    schedule 14.08.2020


Ответы (1)


В этом сценарии было бы уместно использовать EnvironmentObject

class AppState: ObservableObject
   @Published var someVar: Sometype
}

class SceneDelegate {
  let appState = AppState()

  func scene(_ scene: UIScene, 
             continue userActivity: NSUserActivity) {

     // ... other code 
     appState.someVar = ... // modify
  }
}

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

     // .. other code
    let contentView = ContentView()
        .environmentObject(appState)
     //
  }
}

struct ContentView: View {
    @EnvironmentObject var appState

    var body: some View {
        VStack {
            // ... other code
            appState.someVar // use here as needed
        }
    }
}
person Asperi    schedule 14.08.2020
comment
Я работаю над реализацией вашего предложения. Последняя часть (использование appState.someVar внутри ContentView) самая сложная. Потому что, как вы знаете, невозможно поместить оператор if посреди ничего (в этом виде кода), не рассердив компилятор. Сейчас я пытаюсь понять, где я могу это сделать, чтобы все заработало. - person Michel; 14.08.2020