SwiftUI 在自定义 TextField 上切换活动/非活动线条颜色

Posted

技术标签:

【中文标题】SwiftUI 在自定义 TextField 上切换活动/非活动线条颜色【英文标题】:SwiftUI toggle active / inactive line color on custom TextField 【发布时间】:2020-08-19 17:45:58 【问题描述】:

我正在尝试创建一个TextField,并在其下方添加一行,为此我使用了Divide,正如this answer 中所建议的那样,我添加了一个.onTapGesture() 来更改Divider 颜色,但是,这是嵌入在另一个视图中的组件。

在我的ContentView 中,我有一个Button 和我的UnderscoredTextField,它们包含在HStack 中,它包含在Background 组件中(取自this answer),以便能够关闭键盘以编程方式进行,但我希望能够在发生这种情况时更改 UnderscoredTextField 内的 @State var isActive 变量,但由于我是 SwiftUI 新手,我不太确定如何实现这一点。

import SwiftUI

struct ContentView: View 
    var body: some View 
        Background 
            UnderscoredTextField(phoneNumber: "")
        .onTapGesture 
            self.hideKeyboard()
            //How to tell my UnderscoreTextField's isActive variable to change
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


import SwiftUI

struct UnderscoredTextField: View 
    @State var phoneNumber: String
    @State var isActive: Bool = false
    
    var body: some View 
        VStack 
            TextField("12345678", text: $phoneNumber)
                .keyboardType(.phonePad)
                .onTapGesture 
                    self.isActive = true
            
            Divider()
                .padding(.horizontal)
                .frame(height: 1)
                .background(isActive ? Color.red : Color.gray)
        
    


struct UnderscoredTextField_Previews: PreviewProvider 
    static var previews: some View 
        UnderscoredTextField(phoneNumber: "12345678")
    

这是我隐藏键盘时的样子,但我想将其切换回灰色

【问题讨论】:

【参考方案1】:

如果我理解正确,使用onEditingChanged 就足够了,如下所示

var body: some View 
    VStack 
        TextField("12345678", text: $phoneNumber, onEditingChanged: 
                self.isActive = $0     // << here !!
        ).keyboardType(.phonePad)
        Divider()
            .padding(.horizontal)
            .frame(height: 1)
            .background(isActive ? Color.red : Color.gray)
    

【讨论】:

以上是关于SwiftUI 在自定义 TextField 上切换活动/非活动线条颜色的主要内容,如果未能解决你的问题,请参考以下文章

自定义属性包装器无法准确反映我在 SwiftUI 中的 TextField 的状态,知道为啥吗?

自定义 TextField 在 SwiftUI 代码中的 VStack 中不起作用

SwiftUI TextField 绑定到 Double 不使用自定义格式化程序

SwiftUI TextField 强制小写

SwiftUI-使用drawingGroup()禁用TextField

我如何在SWIFTUI中把textField作为firstResponder,就像Swift一样:textField.becomesFirstResponder。