Как скрыть 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
}
}
}