微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI中数组的值和标题列表

如何解决SwiftUI中数组的值和标题列表

我想创建一个列表,每个项目都有一个标题一个值。数组中的值必须是可变的,以便用户键入一个新值来更改数组中的值。

目前,我尝试通过实现新行而不是使用foreach来伪造此内容

一个名为Affiliate的模型,他的属性很少。每个人都有一个Double作为值。其中一些只是用于除法计算后的值。

我想知道如何使用array和foreach而不是独立创建每个var。

我的镜头:

struct Affiliate: Codable,Identifiable{
    
    var id = UUID().uuidString
    
    var presentOfGoal: Double{
        return actualSales / affiliateGoal
    }
    var hourlyDeal: Double {
        return salesNumber / saleph
    }
    var hourlyOutput: Double{
        return sumSales / workHours
    }
    var averageDeal: Double{
        return sumSales / salesNumber
    }
    var averageIPT: Double {
        return productsNum / salesNumber
    }
    
    var affiliateGoal: Double = 0
    var actualSales: Double = 0
    var salesNumber: Double = 0
    var saleph: Double = 0
    var sumSales: Double = 0
    var workHours: Double = 0
    var productsNum: Double = 0
    var servicePoint: Double = 0
    
}

class AffiliateModel: ObservableObject{
    
    @Published var affiliate: Affiliate
    
    private var session = SessionStore.shared
    
    init(){
        affiliate = self.session.affiliate
    }
    
}

标题

enum AffiliateGoals: CaseIterable{
    case affiliateGoal,actualSales,salesNumber,saleph,sumSales,workHours,productsNum,servicePoint,presentOfGoal,hourlyDeal,hourlyOutput,averageDeal,averageIPT
    
    var title: String{
        switch self{
        case .affiliateGoal:
            return "Affiliate Goal"
        case .actualSales:
            return "Actual Sales"
        case .salesNumber:
            return "Sales Number"
        case .saleph:
            return "Sales Per Hour"
        case .sumSales:
            return "Sales Summary"
        case .workHours:
            return "Work Hours"
        case .productsNum:
            return "Products Number"
        case .servicePoint:
            return "Service Point"
        case .presentOfGoal:
            return "Present Of Goal"
        case .hourlyDeal:
            return "Hourly Deal"
        case .hourlyOutput:
            return "Hourly Output"
        case .averageDeal:
            return "Average Deal"
        case .averageIPT:
            return "Average Items Per Transaction"
        }
    }
}

观点:

struct SetAffiliateGoals: View {
    
    @EnvironmentObject var session: SessionStore
    
    @Observedobject var model: AffiliateModel
    
    @Binding var show: Bool
    @State private var showAlert = false
    
    let goals = AffiliateGoals.self
    
    var body: some View {
        NavigationView{
            Form{
                Section(header: Text("Fulfill the details:").padding(.top)){
                    SetGoalRow(title: goals.affiliateGoal.title,value: $model.affiliate.affiliateGoal)
                    SetGoalRow(title: goals.actualSales.title,value: $model.affiliate.actualSales)
                    SetGoalRow(title: goals.saleph.title,value: $model.affiliate.saleph)
                    SetGoalRow(title: goals.salesNumber.title,value: $model.affiliate.salesNumber)
                    SetGoalRow(title: goals.sumSales.title,value: $model.affiliate.sumSales)
                    SetGoalRow(title: goals.workHours.title,value: $model.affiliate.workHours)
                    SetGoalRow(title: goals.productsNum.title,value: $model.affiliate.productsNum)
                    SetGoalRow(title: goals.servicePoint.title,value: $model.affiliate.servicePoint)
                }
            }
    }
}

因为值是Double,所以我尝试创建一个绑定字符串,这样用户每次键入要应用的值时都不需要按Return键。

struct SetGoalRow: View{
    
    @State var title: String
    @Binding var value: Double
    let numberFormatter = NumberFormatter()
    
    var amountProxy: Binding<String> {
        Binding<String>(
            get: { String(format: "%.1f",value) },set: {
                if let value = numberFormatter.number(from: $0) {
                    self.value = value.doubleValue
                }
            }
        )
    }
    
    var body: some View{
        HStack(spacing: 8){
            Text(LocalizedStringKey(title + ":"))
                .layoutPriority(1)
            TextField(LocalizedStringKey(""),text: amountProxy)
                .keyboardType(.decimalPad)
                .multilineTextAlignment(.trailing)
        }
        .lineLimit(1)
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。