web-dev-qa-db-fra.com

Appel d'abandon de manière inattendue lorsque le clavier apparaît à Swiftui

Je ressens un comportement très étrange dans Swiftui 2.0 et iOS14.

Lorsque le clavier apparaît à l'écran, la méthode onappear de la vue d'une autre onglet appelée automatiquement.

Cependant, cela fonctionne bien Xcode 11.7

Voici la question en action. TextField In TabView

Voici le code qui produit l'erreur ci-dessus.

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)")
        })
    }
}

Cela semble être un bug de swiftui 2.0 mais pas sûr. Toute aide serait appréciée.

Merci

17
Malav Soni

Pour éviter de recharger votre vue, essayez avec Tabview

.ignoresSafeArea(.keyboard, edges: .bottom)

Ça ne fonctionne que sur iOS 14

1
Alfonso Mestre

Avoir le même problème moi-même, je pense que c'est un bug ou quelque chose comme ça, mais j'ai proposé une solution peut-être une solution de contournement jusqu'à Apple le réparera.

La chose que j'ai faite est fondamentalement j'ai utilisé un LazyVStack, et cela semble fonctionner parfaitement.

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)")
})
}

Maintenant, la méthode OnAppear de la vue d'une autre onglet n'est pas appelée automatiquement lorsque le clavier apparaît.

Solution

0
Cod3rMax