В основном представлении перечислены элементы и кнопку + для создания нового элемента. Нажатие на элемент открывает еще один вид для редактирования элемента в листе. Это происходит через привязку edititem , который является @state , чтобы сделать его изменчивым (на основе этого ответа).
Проблема возникает, когда я пытаюсь открыть Представление «Редактировать» для элемента сразу после его создания: Код не работает в среде выполнения (iPhone 14 Pro Simulator) при создании нового элемента: < /p>
Код: Выделить всё
Swift/ContiguousArrayBuffer.swift:600: Fatal error: Index out of range
< /code>
Я сжал приложение к следующему минимальному примеру: < /p>
import SwiftUI
struct Model {
var items: [Item]
}
struct Item: Identifiable {
var id: String
}
struct MainView: View {
@Binding var model: Model
@State private var editItem: Binding?
var body: some View {
VStack {
List($model.items) { $item in
ItemCardView(item: $item.wrappedValue)
.onTapGesture {
editItem = $item
}
}
Button(action: {
model.items.append(Item(id: "New item"))
editItem = $model.items.last // WORKS WITHOUT THIS
}) {
Image(systemName: "plus")
}
}.sheet(item: $editItem) { $item in
let _=print($item)
ItemEditView(item: $item)
}
}
}
struct ItemCardView: View {
var item: Item
var body: some View {
Text(item.id)
}
}
struct ItemEditView: View {
@Binding var item: Item
@State private var editingItem: Item = Item(id: "dummy")
var body: some View {
TextField("Title", text: $editingItem.id)
.onAppear {
editingItem = item
}
.onDisappear {
item = editingItem
}
}
}
@main
struct MyApp: App {
@State var model = Model(items: [])
var body: some Scene {
WindowGroup {
MainView(model: $model)
}
}
}
< /code>
Приложение работает без строки < /p>
editItem = $model.items.last // WORKS WITHOUT THIS
i ' не смог определить сбой в отладчике, так как исключение не запускается в моем коде: привязка передана в itemeditView выглядит нормально при его печати (он печатает его дважды, я не знаю, если это а Подсказка). P> Я использую Xcode 14.3 на ноутбуке M1 и нацеливаю на iOS 16.4.
Подробнее здесь: https://stackoverflow.com/questions/762 ... ment-fails