xcode 如果金额为空,则在提交时检查

waxmsbnn  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(116)

我如何从singleMember检查金额是否为空,我需要有这样的示例:

struct SingleMember: View {
var memberItem: MemberInfo
@State var amount: String = ""
var body: some View {
    VStack(alignment:.leading){
        Divider()
        HStack{
            Image("avatar")
            VStack(alignment:.leading){
                Text("\(memberItem.firstName ?? "Unknown")")
                    .font(.custom("Ubuntu-Regular", size:15))
                Text("\(memberItem.phoneNumber ?? "Unknown")")
                    .font(.custom("Ubuntu-Regular", size:12))
                    .foregroundColor(.gray)
            }
            Spacer()
            HStack{
                TextField("Amount", text: $amount)
                    .frame(width:50)
                    .background(.clear)
                Image(systemName: "square.and.pencil")
            }.font(.custom("Ubuntu-Regular", size: 12))
                .foregroundColor(Color.gray)
      
        }
    }
}
}

另一个观点是:

ForEach(memberInfo, id:\.self){ item in
     SingleMember(memberItem: item)
  }

我想要的是检查SingleItem amount是否不为空,如果不为空,则添加到数组item.id,例如item.amount。
我有一个在SingleMember上使用@Binding的想法,但这不起作用,因为这会更新所有TextFields,但我希望每个示例都有自己的数量。

2w3rbyxf

2w3rbyxf1#

你可以尝试在调用SingleMember视图时使用Bindings,并使用onSubmit{...}检查值,例如:

ForEach($memberInfo, id:\.self){ $item in   // <-- $
     SingleMember(memberItem: $item)
  }

在这里你声明

struct SingleMember: View {
 @Binding var memberItem: MemberInfo
 // ...
 
 TextField("Amount", text: $amount)
     .onSubmit {
         if !amount.isEmpty {
             memberItem.amount = ...
         }
     }

或者直接在TextField中使用memberItem.amount,例如:

TextField("Amount", value: $memberItem.amount, format: .number)
dfddblmv

dfddblmv2#

如果您的数据结构中没有amount,但您仍然需要为数据示例的每个项分配amount,那么您应该以某种方式将amount数据附加到它。
你可以使用额外的数组,但简单地 Package 你的值可能会更干净。

struct MemberInfoWithAmount {
    let memberInfo: MemberInfo
    var amount: String
}

您不想更改视图,以便为其创建自定义构造函数。您没有提供代码,但带有ForEach的代码看起来像这样:

struct MemberInfoScreen: View {
    
    @State private var memberInfo: [MemberInfoWithAmount]
    
    init(memberInfo: [MemberInfo]) {
        self.memberInfo = memberInfo.map { .init(memberInfo: $0, amount: "") }
    }
    
    var body: some View {
        ForEach(memberInfo.indices, id: \.self) { index in
            ZStack {
                SingleMember(memberItem: memberInfo[index].memberInfo,
                             amount: $memberInfo[index].amount)
                if memberInfo[index].amount.isEmpty {
                    Text("This item is empty")
                }
            }
        }
    }
}

extension MemberInfoScreen {
    
    private struct MemberInfoWithAmount {
        let memberInfo: MemberInfo
        var amount: String
    }
    
}

是的,在你的另一个视图中,金额现在是一个约束力,如下所示:

struct SingleMember: View {
    
    var memberItem: MemberInfo
    @Binding var amount: String
    
    var body: some View {
        VStack(alignment:.leading){
            Divider()
            HStack{
                Image("avatar")
                VStack(alignment:.leading){
                    Text("\(memberItem.firstName ?? "Unknown")")
                        .font(.custom("Ubuntu-Regular", size:15))
                    Text("\(memberItem.phoneNumber ?? "Unknown")")
                        .font(.custom("Ubuntu-Regular", size:12))
                        .foregroundColor(.gray)
                }
                Spacer()
                HStack{
                    TextField("Amount", text: $amount)
                        .frame(width:50)
                        .background(.clear)
                    Image(systemName: "square.and.pencil")
                }.font(.custom("Ubuntu-Regular", size: 12))
                    .foregroundColor(Color.gray)
                
            }
        }
    }
    
}

相关问题