【SwiftUI】Listにスワイプアクション(swipeActions)を実装する方法!
この記事からわかること
- Swift UIでList構造体にswipeActionsを実装する方法
- HorizontalEdgeの種類
- 複数のボタンを設置するには?
- onDeleteを使った削除ボタンの実装
- 背景色の変更方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
swipeActions(edge:allowsFullSwipe:content:)
公式リファレンス:swipeActions(edge:allowsFullSwipe:content:)
SwiftUIでList
構造体を使用してリスト表示している行にスワイプアクションを追加するにはswipeActions
を使用します。
func swipeActions<T>(
edge: HorizontalEdge = .trailing,
allowsFullSwipe: Bool = true,
content: () -> T
) -> some View where T : View
引数
- edge:スワイプ方向
- allowsFullSwipe:フルスワイプのON/OFF
- content:表示させたいビュー
HorizontalEdge
スワイプする方向は列挙型HorizontalEdge
の値で指定します。左側と右側を選択できます。
@frozen enum HorizontalEdge {
case leading // 左側
case trailing // 右側
}
スワイプアクションを実装する方法
スワイプアクションを実装するには表示させる行ごとにswipeActions
モディファイアを呼び出します。以下はList表示させるデータをForEachを使って回している場合の例です。
List{
ForEach(notification){ notice in
RowNotificationView(notice: notice) // 行ビュー
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
print("削除するよ")
} label: {
Image(systemName: "trash")
}
}
}
}
表示させるcontent
にButton
を設置することでタップ時に処理を実行できるようにすることができます。またButton
にrole
属性を付与することでdestructive
なら背景色が赤色になります。
複数のボタンを設置する
スワイプした際のボタンは複数設置することも可能です。その場合はcontent
内にビューをそのまま複数指定すればOKです。
.swipeActions(edge: .trailing) {
Button(role: .destructive) {
print("削除するよ")
} label: {
Image(systemName: "trash")
}
Button {
print("Swift")
} label: {
Image(systemName: "swift")
}
}
背景色を指定する
スワイプして表示されるボタンの背景色を変更するにはtintモディファイアを使用します。
.swipeActions(edge: .trailing, allowsFullSwipe: false) {
Button(role: .none) {
print("Swift")
} label: {
Text("返却")
}.tint(Color.thema1)
}
onDeleteを使ったスワイプ削除ボタン
onDelete
を使用することで簡単にスワイプ時の削除ボタンを実装することもできます。
ForEach(notification){ notice in
RowNotificationView(notice: notice)
}.onDelete(perform: { index in
manager.removeNotificationRequest(id:notification[index.first!].id)
$notification.remove(atOffsets: index)
isAlert = true
})
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。