вы не можете сделать это со статическим списком.
в реальном мире ваш список островов в любом случае, вероятно, будет виден снаружи.
мы используем вашу структуру:
[...]
struct singleIsland: Identifiable {
var id: Int
var name:String
}
[...]
и создайте привязываемый Объект для хранения этих островов
[...]
class IslandStore : BindableObject {
let didChange = PassthroughSubject<IslandStore, Never>()
var islands : [singleIsland] {
didSet { didChange.send(self) }
}
init (islands: [singleIsland] = []){
self.islands = islands
}
}
[...]
вам нужно импортировать объединение, чтобы использовать BindableObject
[...]
import SwiftUI
import Combine
[...]
ваш взгляд теперь связывает магазин острова
.onDelete (выполнить: удалить) автоматически добавляет движение влево для удаления функции. Мы должны закодировать функцию удаления tho:
[...]
struct ForTesting : View {
@ObjectBinding var store = IslandStore()
var body: some View {
List {
ForEach(store.islands) { island in
Text(island.name)
}.onDelete(perform: delete)
}
}
func delete(at offsets: IndexSet) {
// theres seems to be a bug that prevents us from using atOffsets
// so we convert to index
guard let index = Array(offsets).first else { return }
store.islands.remove(at: index)
}
}
[...]
и пока мы добавляем EditButton () и заголовок. Нам нужно обернуть наш список в NavigationView , чтобы сделать это
[...]
struct ForTesting : View {
@ObjectBinding var store = IslandStore()
var body: some View {
NavigationView {
List {
ForEach(store.islands) { island in
Text(island.name)
}.onDelete(perform: delete)
}
.navigationBarTitle(Text("Islands"))
.navigationBarItems(trailing: EditButton())
}
}
func delete(at offsets: IndexSet) {
// theres seems to be a bug that prevents us from using atOffsets
// so we convert to index
guard let index = Array(offsets).first else { return }
store.islands.remove(at: index)
}
}
[...]
измените раздел DEBUG, чтобы инициализировать магазин островов, и передайте его на ваш вид:
#if DEBUG
var islands = [
singleIsland(id: 0, name: "Wangerooge"),
singleIsland(id: 1, name: "Spiekeroog"),
singleIsland(id: 2, name: "Langeoog"),
singleIsland(id: 3, name: "Baltrum")
]
struct ForTesting_Previews : PreviewProvider {
static var previews: some View {
ForTesting(store: IslandStore(islands:islands))
}
}
#endif
полный код