【问题标题】:Create a default style for a Textfield would fail为文本字段创建默认样式会失败
【发布时间】:2022-12-13 01:03:41
【问题描述】:

我喜欢为我的文本字段设置默认样式。但是某些部分应该可以从视图中自定义。

我确信我使用的方法不正确,因为我得到了一个错误:

struct MaxTextFieldStyle: TextFieldStyle {
    
    @State var icon: Image?
    @State var framesize: Int = 0
    
    func _body(configuration: TextField<Self._Label>) -> some View {
        HStack {
            if icon != nil {
                icon
                    .foregroundColor(Color(UIColor.systemGray4))
            }
            configuration
        }
        .padding()
        .overlay {
            RoundedRectangle(cornerRadius: 8, style: .continuous)
                .stroke(Color(UIColor.systemGray4), lineWidth: 2)
        }
        if(framesize > 0) { .frame(width: framesize) }
        .frame(maxWidth: .infinity, alignment: .trailing)
        .keyboardType(.decimalPad)
    }
}

我如何添加,如果帧大小大于 0,它会添加吗?

【问题讨论】:

  • 您可以使用 avanderlee.com/swiftui/conditional-view-modifier 之类的东西,但要注意使用 if 修饰符可能会破坏身份的潜在问题。此外,此处显示您不需要 @State——当您具有可变状态时,该属性包装器适用于您的示例中没有的状态。

标签: swiftui


【解决方案1】:

将大部分自定义视图提取到函数中可以轻松实现您的要求。

struct MaxTextFieldStyle: TextFieldStyle {
    
    @State var icon: Image?
    @State var framesize: Int = 0
    
    func _body(configuration: TextField<Self._Label>) -> some View {
        if(framesize > 0) { 
            makeView(configuration)
                .frame(width: framesize) 
                .keyboardType(.decimalPad)
        } else {
            makeView(configuration)
                .frame(maxWidth: .infinity, alignment: .trailing)
                .keyboardType(.decimalPad)
        }
    }

    func makeView(_ configuration: TextField<Self._Label>): some View {
        HStack {
            if icon != nil {
                icon
                    .foregroundColor(Color(UIColor.systemGray4))
            }

            configuration
        }
        .padding()
        .overlay {
            RoundedRectangle(cornerRadius: 8, style: .continuous)
                .stroke(Color(UIColor.systemGray4), lineWidth: 2)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多