OnAppear неожиданно вызывает, когда клавиатура появляется в SwiftUI
Я наблюдаю очень странное поведение в SwiftUI 2.0 и iOS14.
Когда на экране появляется клавиатура, автоматически вызывается метод OnAppear представления другой вкладки.
Однако это отлично работает Xcode 11.7
Вот код, который вызывает указанную выше ошибку.
struct ContentView: View {
var body: some View {
TabView {
DemoView(screenName: "Home")
.tabItem {
Image.init(systemName: "star.fill")
Text("Home")
}
DemoView(screenName: "Result")
.tabItem {
Image.init(systemName: "star.fill")
Text("Result")
}
DemoView(screenName: "More")
.tabItem {
Image.init(systemName: "star.fill")
Text("More")
}
}
}
}
struct DemoView:View {
@State var text:String = ""
var screenName:String
var body: some View {
VStack{
Text(screenName)
.font(.title)
TextField("Buggy Keyboard Issue", text: $text)
.textFieldStyle(RoundedBorderTextFieldStyle())
Text("Issue : When keyboard appears, onAppear of other 2 tabs call automatically.")
.font(.footnote)
}
.padding()
.onAppear(perform: {
debugPrint("OnAppear of : \(screenName)")
})
}
}
Кажется, это ошибка SwiftUI 2.0, но не уверен. Любая помощь будет оценена по достоинству.
благодаря
3 ответа
У меня такая же проблема, я думаю, что это ошибка или что-то в этом роде, однако я придумал решение, возможно, обходной путь, пока Apple не исправит его.
То, что я сделал, в основном я использовал
LazyVStack
, и, похоже, это работает отлично.
LazyVStack {
VStack{
Text(screenName)
.font(.title)
TextField("Buggy Keyboard Issue", text: $text)
.textFieldStyle(RoundedBorderTextFieldStyle())
Text("Issue : When keyboard appears, onAppear of other 2 tabs call automatically.")
.font(.footnote)
}
.padding()
.onAppear(perform: {
debugPrint("OnAppear of : \(screenName)")
})
}
Теперь
OnAppear
Метод просмотра другой вкладки не вызывается автоматически при появлении клавиатуры.
Только что реализовал следующий обходной путь:
struct ContentView: View {
var body: some View {
TabView(selection: $selectedTab) {
TabContentView(tag: 0, selectedTag: selectedTab) {
Text("Some tab content")
}
.tabItem {
Text("First tab")
}
TabContentView(tag: 0, selectedTag: selectedTab) {
Text("Another tab content")
}
.tabItem {
Text("Second tab")
}
}
}
@State private var selectedTab: Int = 0
}
private struct TabContentView<Content: View, Tag: Hashable>: View {
init(tag: Tag, selectedTag: Tag, @ViewBuilder content: @escaping () -> Content) {
self.tag = tag
self.selectedTag = selectedTag
self.content = content
}
var body: some View {
Group {
if tag == selectedTag {
content()
.frame(maxWidth: .infinity, maxHeight: .infinity)
} else {
Color.clear
}
}
.tag(tag)
}
private let tag: Tag
private let selectedTag: Tag
private let content: () -> Content
}
Не уверен, что он достаточно стабилен, но внешний вид клавиатуры не срабатывает
onAppear
на содержимом вкладок больше.
Чтобы избежать перезагрузки представления, попробуйте в TabView
.ignoresSafeArea(.keyboard, edges: .bottom)
Работает только на iOS 14