Swiftui: открывающее лист с привязкой к новым элементам массива не удаетсяIOS

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

Сообщение Anonymous »

Во время изучения Swiftui я строю простое приложение для iOS с моделью, которая содержит множество предметов. Эти элементы могут быть созданы и отредактированы.
В основном представлении перечислены элементы и кнопку + для создания нового элемента. Нажатие на элемент открывает еще один вид для редактирования элемента в листе. Это происходит через привязку 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SwiftUI: Как закрыть лист и запустить другой лист из ContentView?
    Anonymous » » в форуме IOS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • SwiftUI: Как закрыть лист и запустить другой лист из ContentView?
    Anonymous » » в форуме IOS
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Как сделать на одной странице меню, открывающее другое содержимое?
    Anonymous » » в форуме CSS
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Регулярное выражение, необязательное (открывающее) скобку
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Необязательное (открывающее) скобку, но тогда закрытие скобки должно быть обязательным
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

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