如何解决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 举报,一经查实,本站将立刻删除。