🐡
[SwiftUI]Listの編集
SwiftUIで編集可能なList
の作成方法をまとめました。
簡単な方法と少し複雑な方法の2通りがあります。ボタンの見た目にこだわるなら後者を使用します。
EditButtonを使う方法
EditButton
を使うと簡単に編集可能なList
が作れます。
struct ContentView: View {
@State private var fruits = ["apple", "orange", "banana", "pineapple", "strawberry", "mango", "melon"]
var body: some View {
NavigationView {
List {
ForEach.init(fruits, id: \.self) { fruit in
Text(fruit)
}.onDelete(perform: { indexSet in
self.fruits.remove(atOffsets: indexSet)
}).onMove(perform: { indices, newOffset in
self.fruits.move(fromOffsets: indices, toOffset: newOffset)
})
}
.navigationBarTitle("Edit List", displayMode: .inline)
.navigationBarItems(trailing: EditButton())
}
}
}
ポイントは以下の3つです
-
EditButton
を使う -
onDelete
を追加することで要素の削除が可能 -
onMove
を追加することで要素の移動が可能
見た目は以下のようになります。
通常 | 編集モード |
---|---|
EditButton
を使うと、簡単に編集が実装できることがわかります。
この方法だと、EditButton
の文言がローカライズ以外変更できないデメリットがあります。
EditModeを使う方法
EnvironmentValues
には編集状態を管理するEditMode
があります。
public enum EditMode {
case inactive
case transient
case active
public var isEditing: Bool { get }
}
extension EnvironmentValues {
public var editMode: Binding<EditMode>?
}
状態管理のための変数を自分で定義し、View
に対して.environment
で適用すればEditMode
を自分で変更することができます。
struct ContentView: View {
@State private var fruits = ["apple", "orange", "banana", "pineapple", "strawberry", "mango", "melon"]
@State var editMode: EditMode = .inactive
var body: some View {
NavigationView {
List {
ForEach.init(fruits, id: \.self) { fruit in
Text(fruit)
}.onDelete(perform: { indexSet in
self.fruits.remove(atOffsets: indexSet)
}).onMove(perform: { indices, newOffset in
self.fruits.move(fromOffsets: indices, toOffset: newOffset)
})
}
.navigationBarTitle("Edit List", displayMode: .inline)
.navigationBarItems(trailing: Button.init(action: { self.editMode = self.editMode.isEditing ? .inactive : .active }, label: {
if self.editMode.isEditing {
Image.init(systemName: "checkmark")
} else {
Image.init(systemName: "square.and.pencil")
}
}))
.environment(\.editMode, self.$editMode)
}
}
}
上記のようにEditMode
を使うことで、ボタンのデザインを変えることができます。
通常 | 編集モード |
---|---|
サンプルコード
参考
Discussion