Brenton Beltrami
Brenton Beltrami

Reputation: 413

SwiftUI: Conditional onDelete

I am trying to create a list that only allows users to delete after entering an editing mode. I attempted to try using ternary operation in the onDelete modifier but was unable to figure it out. Any recommendations?

Here is my code:

struct ContentView: View {
    @State private var stuff = ["First", "Second", "Third"]
    @State private var check = false
    
    var body: some View {
        Form {
            Button(action: { check.toggle() }, label: { Text(check ? "Editing" : "Edit") })
            
            ForEach(0..<stuff.count) { items in
                Section{ Text(stuff[items]) }
            }
             .onDelete(perform: self.deleteItem)
               
        }
    }
    
    private func deleteItem(at indexSet: IndexSet) {
        self.stuff.remove(atOffsets: indexSet)
    }
}

Upvotes: 3

Views: 1170

Answers (3)

rbaldwin
rbaldwin

Reputation: 4888

This can be done directly within the .onDelete method, using the ternary operator:

.onDelete(perform: check ? deleteItem : nil)

Upvotes: 0

Dim Novo
Dim Novo

Reputation: 375

struct ContentView: View {
    @State private
    var stuff = ["First", "Second", "Third"]
    var body: some View {
        NavigationView {
            Form {
                ForEach(0..<stuff.count) { item in
                    Section {
                        Text(stuff[item])
                    }
                }
                .onDelete(
                    perform: delete)
            }
            .navigationBarItems(
                trailing:
                    EditButton()
            )
            .navigationTitle("Test")
        }
    }
}

extension ContentView {
    private func delete(at indexSet: IndexSet) {
        stuff.remove(atOffsets: indexSet)
    }
}

Upvotes: 0

Asperi
Asperi

Reputation: 258345

I assume you look for the following

var body: some View {
    Form {
        Button(action: { check.toggle() }, label: { Text(check ? "Editing" : "Edit") })
        
        ForEach(0..<stuff.count) { items in
            Section{ Text(stuff[items]) }
        }
         .onDelete(perform: self.deleteItem)
         .deleteDisabled(!check)             // << this one !!
    }
}

Upvotes: 4

Related Questions