swiftui - 如何使用 SwiftUI 动态添加联系人等文本字段?

标签 swiftui

我有一个表单,我希望用户可以在其中添加任意数量的促销代码。最接近的 native 示例是在联系人应用程序中。请参阅 add url 部分,我不需要“主页”或“主页”链接,但删除功能是: enter image description here

这如何用 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")
        }
    }
}

看起来像这样:

enter image description here

编辑:


好的,所以我让它变得更加通用,这样您就可以将 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/

相关文章:

ios - 返回上一个 View 后,SwiftUI NavigationLink 突出显示保持突出显示

macos - WKWebView 显示白色条,直到窗口移动/调整大小

swift - 在 SwiftUI 中对路径进行动画处理之前更新路径

ios - 带有 PageTabViewStyle 的 TabView 上的edgesIgnoringSafeArea 不起作用

swiftui - 为什么绑定(bind)到 Picker 在 swiftui 中不再起作用?

swift - 如何使用 swiftUI 创建平滑的颜色变化动画? (有问题的例子)

ios - 有什么方法可以在 SwiftUI 中使用 @ViewBuilder 创建/提取 View 数组

SwiftUI onTapGesture 不适用于 Mac 应用程序中的 ObservedObject

ios - 从托管 Controller 重新加载 SwiftUI View

SwiftUI 如何修复 "Unable to infer complex closure return type; add explicit type to disambiguate"