Как скрыть SwiftUI ToolBarItem, когда список находится в режиме редактирования?

У меня есть простой список внутри стека навигации с панелью инструментов. Панель инструментов содержит кнопку редактирования и кнопку «Готово», позволяющую закрыть представление. Как скрыть кнопку «Готово», когда представление находится в режиме редактирования?

В приведенном ниже коде я пытаюсь использовать переменную среды editMode. В настоящее время это работает неправильно. Он правильно скрывает кнопку «Готово», когда я впервые нажимаю «Изменить», но неправильно отображает кнопку, когда я нажимаю «Готово». Кроме того, нажатие «редактировать» не приводит к немедленному переключению в режим редактирования — теперь для входа в режим редактирования требуется два нажатия на кнопку.

Как мне исправить это, чтобы «готово» возвращалось, когда не редактируется, и чтобы мне нужно было нажать «Изменить» только один раз, чтобы войти в режим редактирования?

      import SwiftUI

struct TestView: View {
    @Environment(\.dismiss) var dismiss
    @Environment(\.editMode) private var editMode
    @State var tests:Array<String> = ["A","B","C"]
    
    var body: some View {
        NavigationStack{
            List{
                Section("Recent"){
                    ForEach(tests, id:\.self){ test in
                        Text(test)
                    }
                    .onDelete{ indexes in
                        tests.remove(atOffsets: indexes)
                    }
                    .onMove{ source, destination in
                        tests.move(fromOffsets: source, toOffset: destination)
                    }
                    
                }
            }
                .navigationTitle("Test")
                .toolbar{
                    ToolbarItem(placement: .navigationBarLeading){
                        EditButton()
                    }
                    if editMode?.wrappedValue.isEditing == false{
                        ToolbarItem(placement: .navigationBarTrailing){
                            Button("Finished"){
                                dismiss()
                            }
                            
                        }
                    }
                }
        }

    }
}

#Preview {
    TestView()
}

1 ответ

К... hide the "Finished" button when the view is in edit mode..., вы можете попробовать этот подход, при котором вы объявляетеisEditingвар сsimultaneousGestureчтобы переключить его и установить.environment(\.editMode,...)соответственно, как показано в примере кода:

      struct TestView: View {
    @Environment(\.dismiss) var dismiss
    @Environment(\.editMode) private var editMode
    @State var tests:Array<String> = ["A","B","C"]
    
    @State private var isEditing = false  // <-- here
    
    var body: some View {
        NavigationStack{
            List{
                Section("Recent"){
                    ForEach(tests, id:\.self){ test in
                        Text(test)
                    }
                    .onDelete{ indexes in
                        tests.remove(atOffsets: indexes)
                    }
                    .onMove{ source, destination in
                        tests.move(fromOffsets: source, toOffset: destination)
                    }
                }
            }
            .navigationTitle("Test")
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                        .simultaneousGesture(TapGesture().onEnded {  // <-- here
                            isEditing.toggle()
                        })
                }
                if !isEditing {  // <-- here
                    ToolbarItem(placement: .navigationBarTrailing) {
                        Button("Finished"){
                            dismiss()
                        }
                    }
                }
            }
            .environment(\.editMode, .constant(isEditing ? .active : .inactive))  // <-- here
        }
    }
        
}
Другие вопросы по тегам