ContentView имеет навигацию, ведущую к AnnotationView, которая отображается, когда определенное свойство истинно.
Вот исходный код ContentView (вероятно, можно игнорировать CameraManager для этой проблемы)
Код: Выделить всё
struct ContentView: View {
var selection: [Int]
@State private var manager: CameraManager?
@State private var navigateToAnnotationView = false
var body: some View {
VStack {
if manager?.dataAvailable ?? false{
ZStack {
// some view
}
Button {
manager!.startPhotoCapture()
// An arbitrary delay
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
navigateToAnnotationView = true
}
} label: {
Image(systemName: "camera.circle.fill")
.resizable()
.frame(width: 60, height: 60)
.foregroundColor(.white)
}
}
else {
VStack {
SpinnerView()
Text("Camera settings in progress")
.padding(.top, 20)
}
}
}
.navigationDestination(isPresented: $navigateToAnnotationView) {
AnnotationView(selection: sharedImageData.segmentedIndices, navigateToAnnotationView: $navigateToAnnotationView)
}
.navigationBarTitle("Camera View", displayMode: .inline)
.onAppear {
if (manager == nil) {
manager = CameraManager(sharedImageData: sharedImageData)
} else {
manager?.resumeStream()
}
}
.onDisappear {
manager?.stopStream()
}
.onChange(of: navigateToAnnotationView) { newNavigateToAnnotationView in
if (!newNavigateToAnnotationView && (manager != nil)) {
manager?.resumeStream()
}
}
}
}
Вот код AnnotationView:
Код: Выделить всё
struct AnnotationView: View {
@State private var index = 0
let options = ["I agree with this class annotation", "I do not agree with this class annotation"]
@State private var selectedOptionIndex: Int? = nil
var selection: [Int]
@Environment(\.dismiss) var dismiss
@Binding var navigateToAnnotationView: Bool
var body: some View {
if (!self.isValid()) {
Rectangle()
.frame(width: 0, height: 0)
.onAppear() {
print("AnnotationView isValid 1 \(self.selection.isEmpty), \(index) vs \(self.selection.count)")
navigateToAnnotationView = false
self.dismiss()
}
} else {
ZStack {
VStack {
ForEach(0.. Bool {
if (self.selection.isEmpty || (index >= self.selection.count)) {
return false
}
return true
}
func nextSegment() {
self.index += 1
}
func refreshView() {
// Any additional refresh logic can be placed here
// Example: fetching new data, triggering animations, sending current data etc.
}
}
Хотя это, кажется, работает, проблема, с которой я столкнулся, заключается в следующем. что когда я снова нажимаю кнопку ContentView, открывающийся «новый» AnnotationView по-прежнему сохраняет те же переменные состояния, что и предыдущий экземпляр AnnotationView.
Похоже, этого не происходит, когда Я избавляюсь от привязки NavigationToAnnotationView. Однако когда я это делаю, обратная навигация к ContentView не работает должным образом, поскольку ни onAppear, ни onChange не запускаются.
Могу ли я узнать, что может происходить с привязкой? ? Кэшируется ли AnnotationView для повышения производительности?
Подробнее здесь: https://stackoverflow.com/questions/790 ... previous-v