所以这是非常快速和肮脏的,但它应该给你一个前进的方向的想法:
struct PromoCodeView: View {
@State var codes = [String]()
func getBinding(forIndex index: Int) -> Binding<String> {
return Binding<String>(get: { codes[index] },
set: { codes[index] = $0 })
}
var body: some View {
NavigationView {
Form {
Section(header: Text("Promo Codes")) {
ForEach(0..<codes.count, id: \.self) { index in
HStack {
Button(action: { codes.remove(at: index) }) {
Image(systemName: "minus.circle.fill")
.foregroundColor(.red)
.padding(.horizontal)
}
TextField("Promo Code", text: getBinding(forIndex: index))
}
}
Button(action: { codes.append("") }) {
HStack {
Image(systemName: "plus.circle.fill")
.foregroundColor(.green)
.padding(.horizontal)
Text("add promo code")
}
}
}
}
.navigationBarTitle("Codes")
}
}
}
看起来像这样:
EDIT:
好的,我已经让它变得更加通用,因此您只需将视图放入其中并将其绑定到字符串数组即可:
struct ListEditor: View {
var title: String
var placeholderText: String
var addText: String
@Binding var list: [String]
func getBinding(forIndex index: Int) -> Binding<String> {
return Binding<String>(get: { list[index] },
set: { list[index] = $0 })
}
var body: some View {
Section(header: Text(title)) {
ForEach(0..<list.count, id: \.self) { index in
ListItem(placeholder: placeholderText, text: getBinding(forIndex: index)) { self.list.remove(at: index) }
}
AddButton(text: addText) { self.list.append("") }
}
}
}
fileprivate struct ListItem: View {
var placeholder: String
@Binding var text: String
var removeAction: () -> Void
var body: some View {
HStack {
Button(action: removeAction) {
Image(systemName: "minus.circle.fill")
.foregroundColor(.red)
.padding(.horizontal)
}
TextField(placeholder, text: $text)
}
}
}
fileprivate struct AddButton: View {
var text: String
var addAction: () -> Void
var body: some View {
Button(action: addAction) {
HStack {
Image(systemName: "plus.circle.fill")
.foregroundColor(.green)
.padding(.horizontal)
Text(text)
}
}
}
}
你可以这样使用它:
struct TestView: View {
@State var codes = [String]()
var body: some View {
NavigationView {
Form {
ListEditor(title: "Promo Codes",
placeholderText: "Promo Code",
addText: "add promo code",
list: $codes)
}
.navigationBarTitle("Codes")
}
}
}
它看起来与上面的 GIF 完全相同。