Отменить функциональность кнопки из другого представления?
У меня есть многоразовая панель поиска в отдельном представлении, которая выглядит так:
struct SearchBar: View {
@Binding var searchText: String
@Binding var isSearching: Bool
var body: some View {
HStack {
HStack {
TextField("Search terms here", text: $searchText)
}
.onTapGesture(perform: {
isSearching = true
})
.overlay(
HStack {
Image(systemName: "magnifyingglass")
if isSearching {
Button(action: { searchText = "" }, label: {
Image(systemName: "xmark.circle.fill")
})
}
}
)
if isSearching {
Button(action: {
isSearching = false
searchText = ""
}, label: {
Text("Cancel")
})
}
}
}
}
И я использую
SearchBar
в нескольких представлениях, например:
SearchBar(searchText: $textFieldSearch, isSearching: $isSearching)
Есть ли способ переопределить / добавить функциональность кнопки отмены:
Button(action: {
isSearching = false
searchText = ""
// pass more functionality here dynamically
},
label: {
Text("Cancel")
})
В некоторых представлениях мне нужно сделать некоторые дополнительные вещи помимо очистки
searchText
поле и установка
isSearching
к ложному.
2 ответа
Решение
Вы можете использовать закрытие. Здесь я создал одно действие закрытия кнопки отмены и установил его как необязательный.
struct SearchBar: View {
@Binding var searchText: String
@Binding var isSearching: Bool
var cancel: (() -> Void)? // <== Here
var body: some View {
HStack {
HStack {
TextField("Search terms here", text: $searchText)
}
.onTapGesture(perform: {
isSearching = true
})
.overlay(
HStack {
Image(systemName: "magnifyingglass")
if isSearching {
Button(action: { searchText = "" }, label: {
Image(systemName: "xmark.circle.fill")
})
}
}
)
if isSearching {
Button(action: {
isSearching = false
searchText = ""
cancel?() // <== Here
}, label: {
Text("Cancel")
})
}
}
}
}
использование
SearchBar(searchText: $textFieldSearch, isSearching: $isSearching)
SearchBar(searchText: $textFieldSearch, isSearching: $isSearching) {
// Cancel Action
}
Если вам нужно дополнительное действие, вы можете ввести
onCancel
побочный эффект как
struct SearchBar: View {
@Binding var searchText: String
@Binding var isSearching: Bool
var onCancel: () -> Void = {} // << default does nothing
...
if isSearching {
Button(action: {
isSearching = false
searchText = ""
onCancel() // << here !!
}, label: {
Text("Cancel")
})
}
и используйте либо по умолчанию, как вы, либо с побочным эффектом, например
SearchBar(searchText: $textFieldSearch, isSearching: $isSearching) {
// side effect is here
}