我有一个表单,我希望用户可以在其中添加任意数量的促销代码。最接近的 native 示例是在联系人应用程序中。请参阅 add url
部分,我不需要“主页”或“主页”链接,但删除功能是:
这如何用 SwiftUI 构建,或者是否有更推荐的方法来处理这种情况?感谢您的帮助!
最佳答案
所以这是非常快速和肮脏的,但它应该给你一个前进方向的想法:
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")
}
}
}
看起来像这样:
编辑:
好的,所以我让它变得更加通用,这样您就可以将 View 放入其中并将其绑定(bind)到您的字符串数组:
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 相同。
关于swiftui - 如何使用 SwiftUI 动态添加联系人等文本字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63633875/