【SwiftUI】Viewの編集モードを切り替える方法

この記事は約4分で読めます。
iOS13.0以上
XCode(当サイトの環境)15.0.1

SwiftUIではEditModeというViewにおけるコンテンツの編集可否を示す環境値があります。

@EnvironmentによりEditModeの値を取得することができます。
取得の際の具体的な記述方法は下記の通りです。

@Environment(\.editMode) private var editMode

EditModeを利用することで何ができるのか?

先述した通りViewの編集可否を切り替えることが可能です。

ListViewでの活用

Listなど特定のビューにおいては、動作と外観を自動的に制御してくれます。
例えばListにonDeleteやonMoveを使用すると、EditButtonを押すと編集可能なモードとなり、リストからデータを削除したり移動させたりできます。

import SwiftUI

struct EditMode1: View {
    @State var sampleArray: [String] = ["apple", "orange", "banana"]
    var body: some View {
        //リストを表示
        VStack {
            //エディットボタンでEditModeを切り替え可能
            EditButton()
            List {
                ForEach(0..<sampleArray.count, id: \.self) { index in
                    HStack {
                        Text(sampleArray[index])
                    }
                }
                .onDelete(perform: deleteItem)
                .onMove(perform: moveItem)
            }
        }
    }
    private func deleteItem(offsets: IndexSet) {
        //指定したオフセットの値を配列から削除
        sampleArray.remove(atOffsets: offsets)
    }
    private func moveItem(from: IndexSet, to: Int) {
        //リストの並び替え
        sampleArray.move(fromOffsets: from, toOffset: to)
    }
}

自分で編集可否を切り替えられるテキストフィールドを作成

EditModeを利用して、独自のViewを作成することも可能です。
以下は編集可否を切り替えられるテキストフィールドを作成しています。

import SwiftUI
struct EditMode2: View {
    //編集可否を取得
    @Environment(\.editMode) var editMode
    @State var input: String = "input"
    var body: some View {
        HStack {
            Spacer()
            
            if editMode?.wrappedValue == .inactive {
                //編集不可の場合は、テキストフィールドを使用不可(.disabled)にしグレーアウトする
                Text(input)
                    .foregroundColor(.gray)
            }
            else {
                //編集可能であれば枠線を表示させてわかりやすくする
                TextField("input", text: $input)
                    .border(Color.black, width: 0.5)
            }
            EditButton()
            Spacer()
        }
    }
}
タイトルとURLをコピーしました