Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从主机控制器重新加载SwiftUI视图_Ios_Watchkit_Swiftui - Fatal编程技术网

Ios 从主机控制器重新加载SwiftUI视图

Ios 从主机控制器重新加载SwiftUI视图,ios,watchkit,swiftui,Ios,Watchkit,Swiftui,有没有办法从其宿主控制器重新加载swiftUI视图 我有一个WKHostingController,它的主体具有快速的UI视图。当视图外部的通知被触发时,我需要更新视图。如果我试图更改@Binding或@State变量,就会出现错误 我无法更新视图之外的值 但我找不到刷新方法 有什么想法吗 主机控制器: class WorkoutListInterfaceController : WKHostingController<WorkoutListView> { override va

有没有办法从其宿主控制器重新加载swiftUI视图

我有一个WKHostingController,它的主体具有快速的UI视图。当视图外部的通知被触发时,我需要更新视图。如果我试图更改@Binding或@State变量,就会出现错误

我无法更新视图之外的值

但我找不到刷新方法

有什么想法吗

主机控制器:

class WorkoutListInterfaceController : WKHostingController<WorkoutListView> {
  override var body: WorkoutListView {
    WorkoutListView(host: self)
  }


  override func didAppear() {
    // update WorkoutListView!!!
  }

  func showExercises(forWorkout workout: Workout) {
    WKInterfaceController.reloadRootControllers(withNamesAndContexts: [(name: "ExerciseListInterfaceController", context: workout as AnyObject)])
  }

  func showAddWorkout() {
    presentController(withNamesAndContexts: [("AddWorkoutHostingController", context: "" as AnyObject)])
  }
}
struct WorkoutListView : View {
  weak var host: WorkoutListInterfaceController?

  @State private var shouldPresentAddWorkout = false
  @State var workouts: [Workout] = Workout.all()

  init(host: WorkoutListInterfaceController) {
    self.host = host
  }

  var body: some View {
    return List {
      Section(header: Text("Workouts")
        .font(.system(size: 18))
        .fontWeight(.bold)
        .frame(height: 18))
      {
        ForEach(workouts) { workout in
          Button(action: {
            self.host?.showExercises(forWorkout: workout)
          }) {
            Text(workout.title)
          }
        }
      }

      Button(action: {
        self.host?.showAddWorkout()
      }) {
        Text("Add Workout")
          .fontWeight(.medium)
          .foregroundColor(.green)
          .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
      }
    }
    .sheet(isPresented: $shouldPresentAddWorkout, onDismiss: {}) {
      AddWorkoutView(host: AddWorkoutHostingController())
    }
    .contextMenu {
      Button(action: { self.host?.showAddWorkout() },
             label: {
              VStack {
                Image(systemName: "plus")
                Text("Add Workout")
              }
      })
    }
  }
}
WorkoutListInterfaceController
didAspect()
被调用,我想更新
WorkoutListView


onAppear()
上,不会调用swiftUI视图修改器。我不知道这是一个bug还是预期的行为,这就是为什么我默认使用宿主控制器上的
didAspect()
来刷新视图。

通过在显示的视图将关闭时发布通知,使用Combine and NotificationCenter实现了这一点:

NotificationCenter.default.post(name: .updateWorkoutsNotification, object: workouts)
然后在WorkoutListView视图模型中订阅该通知

您是否尝试过:

。setNeedsBodyUpdate()


您有没有可能发布您的代码?这可能有助于我们帮助你。谢谢