Я пытаюсь использовать элементы Binding
SwiftUI из @Binding
переменных (благодаря поддержке @dynamicMemberLookup
), но даже с помощью простого примера я могу воссоздать несколько проблем. Скорее всего, я использую его неправильно, но документация и примеры в Интернете говорят об обратном.
Основная проблема (воспроизводимая на Catalina, Big Sur и iPadOS 13 и 14) - это удаление элемента во время view is open вызывает ошибку sh с ошибкой индекса вне допустимого диапазона.
Fatal error: Index out of range: file /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444
Вторичная проблема возникает в текстовом поле Catalina, при попытке редактирования текста скрывается левый / навигационный вид. (В Big Sur редактирование текста скрывает правый / подробный вид, который, как я полагаю, является другим проявлением той же проблемы из-за улучшений в представлениях навигации.) Binding
по существу хранит указатель, поэтому при удалении указатель станет недействительным и вызовет ошибку sh, и что редактирование текстового поля запускает обновление представления родительского представления, аннулируя текущий контент (это поддерживается Биг Сур иногда жалуется, что переменная состояния была изменена во время обновления представления, хотя она правильно используется только для инициализации TextField
). Однако изменение на использование типа класса и @ObservedObject
/ @EnvironmentObject
(или @StateObject
) задерживает cra sh (в Catalina и iPadOS 13/14) до того момента, когда любое другое действие навигации будет выполнено или не окажет никакого эффекта ( на Биг-Суре). Использование опции tag
в NavigationLink
для закрытия представления в случае удаления также не удалось.
Первый вопрос: что я делаю не так? Если ответ на этот вопрос - «Все», как следует управлять массивом данных в представлении верхнего уровня и создавать привязки к членам для вложенных подпредставлений?