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()
    }
    
}

Я уверен, что есть много способов оптимизировать это (как код, так и способ написания вопроса / ответа, поэтому не стесняйтесь предлагать их.

Другие вопросы по тегам