73450


以下の内容についてお聞きしたいです。

### 【実現したい内容】

List表示でeditボタンを押した際に、こちらで指定した行だけ左側の削除ボタンが出て欲しいと思っています。  
以下で言うと例えば0番目のtaroは削除ボタンがあって、hogeは削除ボタンがない状態にしたいです。  
[![サンプル](https://i.stack.imgur.com/TG0b0.png)](https://i.stack.imgur.com/TG0b0.png)

### 【コード】

上記の画像は以下のコードで作成しています。

[code]

    struct Person: Identifiable, Hashable {
      var id: UUID = UUID()
      var name: String
      var age: Int
    }
    
    struct ContentView: View {
      @State var persons: [Person] = [Person(name: "taro", age: 10), Person(name: "hoge", age: 15)]
      
      var body: some View {
        NavigationView {
          List {
            ForEach(self.persons) { person in
              Text(person.name)
            }
            .onDelete(perform: { indexSet in
              self.persons.remove(at: indexSet.first!)
            })
          }
          .navigationBarItems(trailing: EditButton())
        }
      }
    }
    
[/code]

### 【お聞きしたいこと】

  1. 実現したい内容の実現方法

よろしくお願いいたします。


CC BY-SA 4.0
2021-01-20T14:02:41.650
73448
2021-01-20T14:57:39.827
24870
question
swift swiftui
SwiftUI: Listの編集モードで削除できる対象を絞る


[`deleteDisabled(_:Bool)`と言うview
modifier](https://developer.apple.com/documentation/swiftui/gaugestyleconfiguration/maximumvaluelabel-
swift.struct/deletedisabled\(_:\))がちょうどご記載の機能を実現するためのもののようです。

[code]

    struct Person: Identifiable, Hashable {
        var id: UUID = UUID()
        var name: String
        var age: Int
        var deletable: Bool
    }
    
    struct ContentView: View {
        @State var persons: [Person] = [
            Person(name: "taro", age: 10, deletable: true),
            Person(name: "hoge", age: 15, deletable: false),
        ]
        
        var body: some View {
            NavigationView {
                List {
                    ForEach(self.persons) { person in
                        Text(person.name)
                            .deleteDisabled(!person.deletable)
                    }
                    .onDelete(perform: { indexSet in
                        self.persons.remove(at: indexSet.first!)
                    })
                }
                .navigationBarItems(trailing: EditButton())
            }
        }
    }
    
[/code]

SwiftUIのドキュメントの[View
Modifiersのページ](https://developer.apple.com/documentation/swiftui/gaugestyleconfiguration-
maximumvaluelabel-view-
modifiers)を眺めていると、意外なことが簡単に実現できそうなものが見つかったりするので、お時間のある時には時々眺めて試してみるといいかもしれません。


CC BY-SA 4.0
2021-01-20T14:57:39.827
73450
2021-01-20T14:57:39.827
13972
73448
answer