Вы можете использовать .deleteDisabled(_ isDisabled:)
модификатор. Но вы должны учитывать, что тип возвращаемого значения этого модификатора - View
, а не Text
. Так что это немного сложнее в реализации. Вы можете использовать этот пример:
- Создайте
CellView
следующим образом:
struct CellView: View {
var title: String
var isDeletable: Bool
var body: some View {
return Text(title).deleteDisabled(!isDeletable)
}
}
Вы можете создать свою ячейку, используя VStack
s, HStack
sи так далее, но вы должны рассмотреть возможность использования этого модификатора на родительском элементе этой иерархии. Как показано ниже:
var body: some View {
HStack {
VStack {
ZStack {
...
}
}
}
.deleteDisabled(!isDeletable)
}
После этого вы можете использовать его в своем
ForEach
, как показано ниже:
struct ContentView: View {
@State var fruits = ["Apple", "Orange", "Banana"]
var body: some View {
NavigationView {
List {
ForEach(fruits, id: \.self) { fruit -> CellView in
if fruit == "Orange" {
return CellView(title: fruit, isDeletable: true)
} else {
return CellView(title: fruit, isDeletable: false)
}
}
.onMove(perform: move)
.onDelete(perform: delete)
}
.navigationBarItems(trailing: EditButton())
}
}
func delete(offsets: IndexSet) {
fruits.remove(atOffsets: offsets)
}
func move(source: IndexSet, destination: Int) {
fruits.move(fromOffsets: source, toOffset: destination)
}
}