Я работаю над своим первым проектом Swift / SwiftUI (кроме учебных пособий) и столкнулся с общей проблемой - ошибкой Generic parameter 'Parent' could not be inferred
- в верхней части окна, когда проблема на самом деле с List
я пытаюсь создать нижнюю часть формы.
Приложение, которое я создаю, представляет собой простое приложение для выставления счетов: пользователь заполняет поля формы и отправляет счет. Счет может содержать несколько позиций, которые пользователь вводит по одной за раз, а затем добавляет в словарь, который должен отображать внутри формы.
Это соответствующие переменные сверху структура и начало представления, где, я надеюсь, я объявляю переменные для позиций правильно, чтобы модифицировать их на основе пользовательского ввода.
* Отредактировано в соответствии с рекомендациями @ asperi ниже.
@State private var lineItems = [LineItem]()
@State private var lineItem = LineItem()
struct LineItem: Codable, Hashable {
var productSku: String = ""
var productName: String = ""
var quantity: Double = 0
var unitPrice: Double = 0
}
func addLineItem(lineItem: LineItem){
lineItems.append(lineItem)
}
...
var body: some View {
NavigationView {
Form {
Section(header: Text("Customer Information")) { <-- error appears here
TextField("Customer Name", text: $customerName)
TextField("Customer Email", text: $customerEmail)
}
Вот соответствующая часть формы, где я пытаюсь перечислить все текущие позиции, а затем разрешить пользователю вставлять дополнительные позиции. Я не получаю никакой ошибки, пока не добавлю код List
, так что я почти уверен, что делаю что-то не так.
Section(header: Text("Items")) {
List(lineItems, id: \.self) { item in
LineItemRow(lineItem: item)
Text(item.productName)
}
TextField("Product SKU", text: $productSKU)
TextField("Poduct Name", text: $productName)
TextField("Unit Price", text: $unitPrice, formatter: DoubleFormatter())
Picker("Quantity", selection: $quantity) {
ForEach(0 ..< 10) {
Text("\($0)")
}
}
Button(action: {
self.addLineItem(lineItem: LineItem(productSku:$productSKU,
productName:$productName,
quantity:$unitPrice,
unitPrice:$quantity))
print($lineItems)
}, label: {
Text("Add line item")
})
}
Я проверил функциональность кнопок в консоли и кажется, что он правильно добавляется в словарь, но мне нужно, чтобы он отображался также.
Возможно, я что-то неправильно понял c с List
. Любой совет?
Для справки, вот весь вид:
struct AddInvoiceForm: View {
@State private var invoiceNumber: String = ""
@State private var _description: String = ""
@State private var dueDate: Date = Date()
@State private var sendImmediately: Bool = true
@State private var currency = 0
@State private var paymentType = 0
@State private var customerName: String = ""
@State private var customerEmail: String = ""
@State private var productSKU: String = ""
@State private var productName: String = ""
@State private var quantity: Int = 0
@State private var unitPrice: String = ""
@State private var lineItems = [LineItem]()
@State private var lineItem = LineItem()
struct LineItem: Codable, Hashable {
var productSku: String = ""
var productName: String = ""
var quantity: Double = 0
var unitPrice: Double = 0
}
func addLineItem(lineItem: LineItem){
lineItems.append(lineItem)
}
@State private var totalAmount: Double = 0.0
static let currencies = ["USD","GBP"]
var body: some View {
NavigationView {
Form {
Section(header: Text("Customer Information")) {
TextField("Customer Name", text: $customerName)
TextField("Customer Email", text: $customerEmail)
}
Section(header: Text("Invoice Information")) {
TextField("Invoice Number", text:$invoiceNumber)
TextField("Description", text:$_description)
DatePicker(selection: $dueDate, in: Date()..., displayedComponents: .date) {
Text("Due date")
}
Picker("Currency", selection: $currency) {
ForEach(0 ..< Self.currencies.count) {
Text(Self.currencies[$0])
}
}
}
Section(header: Text("Items")) {
List(lineItems, id: \.self) { item in
LineItemRow(lineItem: item)
Text(item.productName)
}
TextField("Product SKU", text: $productSKU)
TextField("Poduct Name", text: $productName)
TextField("Unit Price", text: $unitPrice, formatter: DoubleFormatter())
Picker("Quantity", selection: $quantity) {
ForEach(0 ..< 10) {
Text("\($0)")
}
}
Button(action: {
self.addLineItem(lineItem: LineItem(productSku:$productSKU,
productName:$productName,
quantity:$unitPrice,
unitPrice:$quantity))
print($lineItems)
}, label: {
Text("Add line item")
})
}
Section(header: Text("Totals")) {
Text("\(totalAmount)")
}
Section {
Button(action: {
print(Text("Send"))
}, label: {
Text("Send invoice")
})
}
}.navigationBarTitle("Invoice Details")
}
}
}