无法输入文本字段

Posted

技术标签:

【中文标题】无法输入文本字段【英文标题】:Unable to type in TextField 【发布时间】:2019-06-12 03:06:29 【问题描述】:

我正在使用 SwiftUI 框架创建一个SignUp 屏幕。

我有两个文本字段,FirstNameLastName,还有一个按钮。

我将它们归为VStack

当我运行应用程序时,按钮是可点击的,但我无法在文本字段中输入任何内容。

这是我的代码:

@State var firstName = ""
@State var lastName = ""
var body: some View 

    NavigationView 

        VStack 

            VStack 

                VStack 

                    Group 
                       TextField($firstName, placeholder: Text("First Name")).padding(10)
                    .background(Color.white).clipShape(RoundedRectangle(cornerRadius: 5))
                        .shadow(radius: 3)

                    Group 
                        TextField($lastName, placeholder: Text("Last Name")).padding(10)
                    .background(Color.white).clipShape(RoundedRectangle(cornerRadius: 5))
                        .shadow(radius: 3)

                    Button(action: 
                    ) 
                        Group 
                            Text("Create User").color(.white).padding(10)
                        .background(Color.blue).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 5)
                    
                .padding(12)
                .background(Color.gray)
                .shadow(radius: 5)

            .background(Color.gray)

        .navigationBarTitle(Text("Sign Up"))
    

【问题讨论】:

【参考方案1】:

似乎在颜色/不透明度效果之后设置shadow 会导致此特定场景中的问题。

为确保合成效果在阴影之前渲染,您可以将.compositingGroup() 添加到您的VStack - 就在shadow 之前 - 这样就解决了问题。

Documentation 说:

合成组使此视图的祖先视图中的合成效果(例如不透明度和混合模式)在此视图渲染之前生效。

修改后的代码

VStack 
    // [...]  

.padding(12)
.background(Color.gray)
.compositingGroup() // THIS
.shadow(radius: 5)
.navigationBarTitle(Text("Sign Up"))

用户界面可以通过这种方式进一步简化 - 达到相同的效果。

struct ContentView: View 

    @State var firstName = ""
    @State var lastName = ""

    var body: some View 

        NavigationView 

            VStack 

                    TextField($firstName, placeholder: Text("First Name"))
                        .padding(10)
                        .background(Color.white)
                        .cornerRadius(5)
                        .shadow(radius: 3)

                    TextField($lastName, placeholder: Text("Last Name"))
                        .padding(10)
                        .background(Color.white)
                        .cornerRadius(5)
                        .shadow(radius: 3)

                    Button(action:  ) 
                        Text("Create User")
                            .color(.white)
                            .padding(10)
                            .background(Color.blue)
                            .cornerRadius(5)
                            .shadow(radius: 5)
                    
            
            .padding(12)
            .background(Color.gray)
            .compositingGroup()
            .shadow(radius: 5)
            .navigationBarTitle(Text("Sign Up"))
        

    


【讨论】:

我相信这应该是公认的答案,因为它允许原始发布者仍然实现他想要的 UI。【参考方案2】:

在 VStack 创建问题上添加了阴影。请检查下面的代码。我已经把影子注释掉了。

struct ContentView: View 

    @State var firstName = ""
    @State var lastName = ""
    var body: some View 

        NavigationView 

            VStack 

                VStack 

                    VStack 

                        Group 
                            TextField($firstName, placeholder: Text("First Name")).padding(10)
                            .background(Color.black).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 3)

                        Group 
                            TextField($lastName, placeholder: Text("Last Name")).padding(10)
                            .background(Color.black).clipShape(RoundedRectangle(cornerRadius: 5))
                            .shadow(radius: 3)

                        Button(action: 
                            print("Button Tapped")
                        ) 
                            Group 
                                Text("Create User").color(.white).padding(10)
                                .background(Color.blue).clipShape(RoundedRectangle(cornerRadius: 5))
                                .shadow(radius: 5)
                        
                        .padding(12)
                        .background(Color.gray)
//                        .shadow(radius: 5)

                    .background(Color.gray)

                .navigationBarTitle(Text("Sign Up"))
        
    

【讨论】:

以上是关于无法输入文本字段的主要内容,如果未能解决你的问题,请参考以下文章

无法在文本字段中获取文本输入以解析为双精度

window.alert() 后无法编辑输入文本字段

同时在文本字段中输入时无法更新 TextArea

Flutter for web,无法输入文本字段

快速解析时无法在json post请求参数中添加文本字段输入的文本

TinyMCE 4 无法输入提供的插件文本字段