EditButton () в SwiftUI не запускает EditMode
Похоже, что EditButton () в SwiftUI (Xcode 12.5 beta 3) имеет различные проблемы.
В моем коде все работало нормально, пока я не заменил List на ScrollView и не добавил LazyVGrid. Теперь, когда пользователь нажимает на EditButton, EditMode не активируется.
Есть идеи обходного пути? Наличие двух столбцов - это требование пользовательского интерфейса, и хотя я могу работать со списком, я предпочитаю вид ScrollView. Я пробовал множество вещей ... поместил ForEach в раздел и поместил EditButton в заголовок, заменив его ручной кнопкой ... к сожалению, ни один из них, похоже, не работает :-(
Большое спасибо за любые мысли или все, что кто-то сделал, чтобы обойти это.
struct Home: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: Cars.entity(), sortDescriptors: []) var cars: FetchedResults<Cars>
private var columns: [GridItem] = [
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
NavigationView {
ScrollView {
if cars.count > 0 {
LazyVGrid(
columns: columns) {
ForEach(cars) { n in
Text("hello")
}
.onDelete(perform: deleteCars)
}
}
else {
Text("You have no cars.")
}
}
.navigationBarItems(leading: EditButton())
}
}
func deleteCars(at offsets: IndexSet) {
for offset in offsets {
let cars = cars[offset]
viewContext.delete(cars)
}
try? viewContext.save()
}
}
1 ответ
TL; DR: вручную создайте EditButton и добавьте его непосредственно в цикл ForEach. Убедитесь, что в массиве ForEach указаны индексы.
Хорошо, наконец-то нашел ответ после прогресса в Попытке 1 выше ... работал, добавляя .indices в массив в цикле ForEach. Здесь идет полностью:
struct Home: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(entity: Cars.entity(), sortDescriptors: []) var cars: FetchedResults<Cars>
@State var isEditing = false
private var columns: [GridItem] = [
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
NavigationView {
VStack{
ScrollView {
if cars.count > 0 {
LazyVGrid(
columns: columns) {
ForEach(cars.indices, id: \.self) { n in
Text("hello")
Button(action : {
deleteCars(at: [n])
print("item deleted")
})
{Text("\(isEditing ? "Delete me" : "not editing")")}
}
}
.environment(\.editMode, .constant(self.isEditing ? EditMode.active : EditMode.inactive)).animation(Animation.spring())
}
}
else {
Text("You have no cars.")
}
}
.navigationBarItems(leading: Button(action: {
self.isEditing.toggle()
}) {
Text(isEditing ? "Done" : "Edit")
.frame(width: 80, height: 40)
}
)
}
}
func deleteCars(at offsets: IndexSet) {
for offset in offsets {
let cars = cars[offset]
viewContext.delete(cars)
}
try? viewContext.save()
}
}
Я уверен, что есть много способов оптимизировать это (как код, так и способ написания вопроса / ответа, поэтому не стесняйтесь предлагать их.