У меня ошибка при использовании NavigationLinks и ObservableObject. Я не совсем понимаю почему, потому что я не понимаю, что происходит с представлениями и данными во время навигации. Это некий псевдокод, иллюстрирующий проблему:
class Settings: ObservableObject {
@Published var data: [Int] = [0, 1, 2, 3, 4, 5]
}
struct ContentView: View {
@State var new_view: Bool = false
@ObservedObject var content_view_settings = Settings()
var body: some View {
NavigationView {
VStack {
Button(action: {
DeleteLastItem()
}) {
Text("Delete last item")
}
Button(action: {
self.new_view = true
}) {
Text("New View")
}
NavigationLink(destination: NewView(new_view_settings: content_view_settings), isActive: $new_view) {
EmptyView()
}
}
}
}
}
struct NewView: View {
@ObservedObject var new_view_settings: Settings
@State var index = -1
var body: some View {
VStack {
Button(action: {
self.index = self.new_view_settings.count - 1
}) {
Text("change index")
}
if self.index > -1 {
Text("\(self.new_view_settings.data[index])")
}
}
}
}
Описание проблемы таково:
У меня есть представление с ObservedObject, которое я передаю последующему представлению при навигации. Это вспомогательное представление обращается к последнему элементу массива, но делает это только после того, как индексная переменная проверяется нажатием кнопки. Затем текст отображается только после проверки индекса.
Теперь предположим, что я проверяю индекс, чтобы в этом примере он был равен 5. Затем я возвращаюсь к исходному виду. Если я удалю последний элемент, индекс 5 перестанет действовать. Как только я удалю этот последний элемент, я получаю неверную ошибку индекса и симулятор вылетает.
Но скажем, я двигаюсь назад и не удаляю последний элемент. Затем, когда я перехожу вперед, индексная переменная сбрасывается.
Поскольку я получаю сбой, это означает, что представление все еще живо и обновляется или что-то в этом роде, но когда я снова перехожу к нему, представление перезагружается. Означает ли это, что представление живо, пока не будет снова инициализировано? Это надуманный код, но по сути это проблема, с которой я столкнулся. Я думал, что исходный код будет немного сложнее понять.