【问题标题】:Keyboard bug when tapping on TextField in SwiftUI在 SwiftUI 中点击 TextField 时出现键盘错误
【发布时间】:2021-08-04 11:14:35
【问题描述】:

我有一个包含多个视图的主视图,并根据 ObservabledObject 中变量的值变化选择一个,该变化在按钮按下时发生变化。

当我选择一个包含输入字段的视图时出现问题,在这种情况下,当我点击一个文本字段时,它没有显示键盘,而是将我带回主页视图。

它只发生在设备上,而不是模拟器上。

不过,如果将特定视图(带有 TextField 的视图)设置为主视图(Switch 中的第一种情况),它就可以工作。

这是 ObservableObject 代码:

class Watcher : ObservableObject {
    @Published var currentView: String = "home"
}

主视图:

import SwiftUI

struct MainView : View {
    var body: some View {
        
        GeometryReader { geometry in
            ZStack (alignment: .leading){
                HomepageView()
                    .frame(width: geometry.size.width, height: geometry.size.height)
            }
        }
    }
}

struct HomepageView : View {
    @ObservedObject var watcher = Watcher()
    
    init(){
        UITabBar.appearance().isHidden = true
        JSONHandler.fetchData(webService: "https://myWebsite.com/app/request.php") {
            print("loaded")
        }
    }
    
    var body: some View {
        ZStack {
            VStack {
                TabView {

                    switch self.watcher.currentView {
                    case "home":                                       //STARTING CASE
                        NavigationView {
                            DailyMenuView()
                                .navigationTitle("Recipes APP")
                                .navigationBarTitleDisplayMode(.inline)
                        }
                        .opacity(self.watcher.currentView == "newRecipe" ? 0 : 1)

                    case "innerMenu":
                        InnerMenuView(watcher: watcher)

                    case "members":
                        MembersView(watcher: watcher)

                    case "recipe":
                        RecipeView(watcher: watcher)

                    case "newRecipe":                                  //TextField View
                        TestView()

                    default:
                        Text("Error")
                    }
                }
            }
            
            VStack {
                Spacer()
                
                MenuTabView(watcher: watcher)
            }                
            .edgesIgnoringSafeArea(.bottom)
            
        }
        .environment(\.colorScheme, self.watcher.currentView == "home" ? .dark : .light)
        
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}

最后是包含 TextField 的 View:

import SwiftUI

struct TestView: View {
    @State var text: String = ""
    
    var body: some View {
        VStack {
            Text("TEST VIEW")
                .font(.largeTitle)
                .fontWeight(.bold)
            
            Spacer()
            
            TextField("Write here", text: $text)
                .font(.title)
                .padding()
                .border(Color.red, width: 2)
            
            Spacer()
        }
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

希望你能帮我解决这个问题!

如果您需要更多信息,请询问我。

【问题讨论】:

    标签: swift swiftui keyboard ios14


    【解决方案1】:

    你需要使用标签和选择。

    TabView(selection: $watcher.currentView) { // < === Here
        
        switch self.watcher.currentView {
        case "home":                                       //STARTING CASE
            NavigationView {
                DailyMenuView()
                    .navigationTitle("Recipes APP")
                    .navigationBarTitleDisplayMode(.inline)
            }
            .opacity(self.watcher.currentView == "newRecipe" ? 0 : 1)
            .tag("home") // < === Here
            
        case "innerMenu":
            InnerMenuView(watcher: watcher)
                .tag("innerMenu") // < === Here
        case "members":
            MembersView(watcher: watcher)
                .tag("members") // < === Here
            
        case "recipe":
            RecipeView(watcher: watcher)
                .tag("recipe") // < === Here
        case "newRecipe":                                  //TextField View
            TestView()
                .tag("newRecipe") // < === Here
            
        default:
            Text("Error")
        }
    }
    

    【讨论】:

    • 谢谢!我也忘了使用标签,即使它没有解决问题。我一团糟!
    【解决方案2】:

    我解决了搬家问题:

    @ObservedObject var watcher = Watcher()
    

    主视图内部如下:

    struct MainView : View {
        @ObservedObject var watcher = Watcher()
    
        var body: some View {            
            GeometryReader { geometry in
                ZStack (alignment: .leading){
                    HomepageView()
                        .frame(width: geometry.size.width, height: geometry.size.height)
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 2021-05-22
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2020-01-18
      • 2020-05-17
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多