Проблема: если в представлении с навигацией есть модификатор searchable
и когда вы выбираете поле для поиска (чтобы клавиатура была открыта), и если вы возвращаете это представление назад, выбирая элемент, первое представление зависает (не отвечает на ввод данных пользователем). Эта проблема возникает только с полем поиска, но не с любыми другими текстовыми полями. Кроме того, проблема существует только в iOS 16, так как в iOS 15 проблем нет.
Xкод: 14.3
Целевая версия проекта: iOS 15
Версия симулятора и устройства: iOS 16
Код для воспроизведения проблемы:
struct ContentView: View {
private let options: [String] = ["ABC", "DEF", "GHI", "JKL", "MNO"]
@State private var selection: String?
var body: some View {
NavigationView {
NavigationLink {
CustomPicker(selection: $selection, options: options)
} label: {
HStack {
Text("Picked value")
Spacer()
Text(selection ?? "Pick >")
}
.accentColor(.black)
}
.padding()
}
.navigationViewStyle(.stack)
}
}
struct CustomPicker: View {
@Environment(\.dismiss) private var dismiss
@Binding var selection: String?
let options: [String]
var body: some View {
List(options, id: \.self) { option in
Button {
selection = option
dismiss()
} label: {
Text(option)
}
}
.searchable(text: .constant(""))
}
}
Я попытался закрыть представление с помощью isActive в NavigationLink(isActive: )
, но это не сработало.
@loremipsum Я пишу этот код, чтобы показать проблему. Это не мой производственный код.
У меня была такая же проблема несколько месяцев назад: Ошибка навигации при закрытии представления при фокусировке на пустом модификаторе .searchable()
Я отправил отчет об ошибке в Apple, но еще не получил от них никаких отзывов.
На данный момент я обошел эту ошибку, установив привязку .searchable() к пробелу " " перед переходом, и это, похоже, работает для меня.
Вы можете попробовать что-то вроде этого:
struct CustomPicker: View {
@Environment(\.dismiss) private var dismiss
@Binding var selection: String?
@State var mySearchText: String // <---
let options: [String]
var body: some View {
List(options, id: \.self) { option in
Button {
selection = option
mySearchText = " " <---
dismiss()
} label: {
Text(option)
}
}
.searchable(text: $mySearchText) // <---
}
}
Почему вы используете
constant
, нет причин использовать это внеPreview