SwiftUI: представление потенциально кэшируется, если оно имеет привязку к предыдущему представлению, которое осуществляеIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftUI: представление потенциально кэшируется, если оно имеет привязку к предыдущему представлению, которое осуществляе

Сообщение Anonymous »

У меня есть два представления: ContentView и AnnotationView.
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 имеет привязку к свойству NavigationToAnnotationView.
Вот код 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.
}
}
Попытка в AnnotationView заключается в том, что если isValid() возвращает false, я немедленно возвращаюсь к ContentView.
Хотя это, кажется, работает, проблема, с которой я столкнулся, заключается в следующем. что когда я снова нажимаю кнопку ContentView, открывающийся «новый» AnnotationView по-прежнему сохраняет те же переменные состояния, что и предыдущий экземпляр AnnotationView.
Похоже, этого не происходит, когда Я избавляюсь от привязки NavigationToAnnotationView. Однако когда я это делаю, обратная навигация к ContentView не работает должным образом, поскольку ни onAppear, ни onChange не запускаются.
Могу ли я узнать, что может происходить с привязкой? ? Кэшируется ли AnnotationView для повышения производительности?

Подробнее здесь: https://stackoverflow.com/questions/790 ... previous-v
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»