ContentView имеет навигацию, ведущую к AnnotationView, которая отображается, когда определенное свойство истинно.
Вот исходный код ContentView (вероятно, можно игнорировать CameraManager для этой проблемы)
Код: Выделить всё
import SwiftUI
import AVFoundation
import Vision
import Metal
import CoreImage
import MetalKit
// TODO: Make this a class variable instead of a global variable
var annotationView: Bool = false
class SharedImageData: ObservableObject {
@Published var cameraImage: UIImage?
@Published var depthData: CVPixelBuffer?
// @Published var depthDataImage: UIImage?
@Published var pixelBuffer: CIImage?
// @Published var objectSegmentation: CIImage?
// @Published var segmentationImage: UIImage?
@Published var segmentedIndices: [Int] = []
// Single segmentation image for each class
@Published var classImages: [CIImage] = []
}
struct ContentView: View {
var selection: [Int]
@StateObject private var sharedImageData = SharedImageData()
@State private var manager: CameraManager?
@State private var navigateToAnnotationView = false
var objectLocation = ObjectLocation()
var body: some View {
VStack {
if manager?.dataAvailable ?? false{
ZStack {
HostedCameraViewController(session: manager!.controller.captureSession)
HostedSegmentationViewController(sharedImageData: sharedImageData, selection: Array(selection), classes: Constants.ClassConstants.classes)
}
Button {
annotationView = true
objectLocation.settingLocation()
manager!.startPhotoCapture()
// TODO: Instead of an arbitrary delay, we should have an event listener to the CameraManager
// that triggers when the photo capture is completed
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(sharedImageData: sharedImageData, objectLocation: objectLocation,
selection: sharedImageData.segmentedIndices, classes: Constants.ClassConstants.classes,
navigateToAnnotationView: $navigateToAnnotationView
)
}
.navigationBarTitle("Camera View", displayMode: .inline)
.onAppear {
print("Is Manager Nil \(self.manager == nil)")
if (manager == nil) {
manager = CameraManager(sharedImageData: sharedImageData)
} else {
// TODO: Need to check if simply resuming the stream is enough
// or do we have to re-initialize some other properties
manager?.resumeStream()
}
}
.onDisappear {
manager?.stopStream()
}
.onChange(of: navigateToAnnotationView) { newNavigateToAnnotationView in
if (!newNavigateToAnnotationView && (manager != nil)) {
manager?.resumeStream()
}
}
}
}
Вот код AnnotationView:
Код: Выделить всё
import SwiftUI
struct AnnotationView: View {
@ObservedObject var sharedImageData: SharedImageData
@State private var index = 0
let options = ["I agree with this class annotation", "Annotation is missing some instances of the class", "The class annotation is misidentified"]
@State private var selectedOptionIndex: Int? = nil
var objectLocation: ObjectLocation
var selection: [Int]
var classes: [String]
@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 {
HStack {
Spacer()
HostedAnnotationCameraViewController(sharedImageData: sharedImageData, index: index)
Spacer()
}
HStack {
Spacer()
Text("Selected class: \(classes[selection[index]])")
Spacer()
}
ProgressBar(value: calculateProgress())
HStack {
Spacer()
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.
}
func calculateProgress() -> Float {
return Float(self.index) / Float(self.selection.count)
}
}
Хотя это, кажется, работает, проблема, с которой я столкнулся, заключается в следующем. что когда я снова нажимаю кнопку ContentView, открывающийся «новый» AnnotationView по-прежнему сохраняет те же переменные состояния, что и предыдущий экземпляр AnnotationView.
Похоже, этого не происходит, когда Я избавляюсь от привязки NavigationToAnnotationView. Однако когда я это делаю, обратная навигация к ContentView не работает должным образом, поскольку ни onAppear, ни onChange не запускаются.
Могу ли я узнать, что может происходить с привязкой? ? Кэшируется ли AnnotationView для повышения производительности?
Подробнее здесь: https://stackoverflow.com/questions/790 ... previous-v