【问题标题】:SwiftUI Custom textfield with onEditingChanged closure带有 onEditingChanged 闭包的 SwiftUI 自定义文本字段
【发布时间】:2022-01-05 19:14:16
【问题描述】:

关于 SwiftUI 的新闻,请告诉我 :) 我有一个自定义文本字段设置为单独文件中的结构。

我想在我的内容视图中使用 onEditingChanged(关闭将是完美的),这可能吗?我尝试过绑定,但这不是一个很好的解决方案。

import Foundation
import SwiftUI

struct EntryField: View {
    
    var sfSymbolName: String
    var placeHolder: String
    var prompt: String
    @Binding var field: String
    var uptodate:Bool = false
    var showActivityIndicator:Bool = false
    @State var checkMarkOpacity = 0.9
    @Binding var editingChanged: Bool

    var body: some View {
        VStack(alignment: .leading) {
            
            HStack {
                Image(systemName: sfSymbolName)
                    .foregroundColor(.gray)
                    .font(.custom("SF Pro Light", size: 60))
                
                TextField(placeHolder, text: $field, onEditingChanged: { editing  in
                    
                    editingChanged = editing
                    
                }).autocapitalization(.none)
                    .keyboardType(.decimalPad)
                    .font(.custom("SF Pro Light", size: 60))
                    .placeholder(when: field.isEmpty) {
                        
                        Text("0,00")
                            .foregroundColor(.white)
                            .font(.custom("SF Pro Light", size: 60))
                    }
                
                    Image(systemName: "checkmark").opacity(uptodate ? 1 : 0)
                    .opacity(checkMarkOpacity)
                    .foregroundColor(.white)
                    .font(.custom("SF Pro Light", size: 40))
                    .onAppear(perform: {
                        
                        withAnimation(.easeIn(duration: 3.0).delay(2.0) ) {
                            checkMarkOpacity = 0
                        }
                        
                    })
            
                    .overlay(
                        
                        ProgressView()
                            .opacity(showActivityIndicator ? 1 : 0)
                            //.progressViewStyle(ShadowProgressViewStyle())
                            .progressViewStyle(RingProgressViewStyle(
                                configuration: .init(
                                    trackColor: .blue,
                                    fillColor: .white,
                                    lineWidth: 6)))
                           
                    )
                
            }
            .padding(8)
            
              .background(Color(UIColor.secondarySystemBackground))
              .clipShape(RoundedRectangle(cornerRadius:10))
            
            Text(prompt)
            .fixedSize(horizontal: false, vertical: true)
            .font(.caption)
        }
    }
}

在我的内容视图中,我有:

@State private var editingChanged: Bool = false

 EntryField(sfSymbolName: "eurosign.square", placeHolder: "", prompt: "Litre Price", field: $closestLitrePrice, uptodate: uptodate, showActivityIndicator: showActivityIndicator, editingChanged: $editingChanged)

谢谢

【问题讨论】:

    标签: swiftui closures textfield


    【解决方案1】:

    如果你在内部不需要它,那么你可以将闭包直接从构造传递给TextField,比如

    let editingChanged: (Bool) -> Void      // << here !!
    
    var body: some View {
      VStack(alignment: .leading) {
    
        HStack {
          Image(systemName: sfSymbolName)
            .foregroundColor(.gray)
            .font(.custom("SF Pro Light", size: 60))
    
          TextField(placeHolder, text: $field, 
                    onEditingChanged: editingChanged)  // << here !!
            .autocapitalization(.none)
    
    

    【讨论】:

    • 谢谢。那工作得很好。这很酷。内部是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多