SwiftUI:表单中的按钮

Posted

技术标签:

【中文标题】SwiftUI:表单中的按钮【英文标题】:SwiftUI: Button in Form 【发布时间】:2021-03-08 16:15:24 【问题描述】:

我正在 SwiftUi 中创建一个表单,其中包含灵活数量的指令。

在最后一条指令 TextField 旁边,我显示了一个“+”按钮,它使用新成员扩展指令数组:

var body: some View 
        NavigationView 
            Form 
                ...

                Section(header: Text("Instructions")) 
                    InstructionsSectionView(instructions: $recipeViewModel.recipe.instructions)
                 
            ... 

struct InstructionsSectionView: View 
        @Binding var instructions: [String]
        var body: some View 
            ForEach(instructions.indices, id: \.self)  index in
                HStack 
                    TextField("Instruction", text: $instructions[index])
                    if(index == instructions.count-1) 
                        addInstructionButton
                    
                
            
        
        
        var addInstructionButton: some View 
            Button(action: 
                instructions.append("")
            ) 
                Image(systemName: "plus.circle.fill")
            
        
    

现在的问题是,按钮点击区域不仅限于图片,而是整个最后一行。恰好是 textField 周围的部分,这意味着如果我点击它,我可以编辑文本,但如果我点击某处的边框,则会添加一个新条目。

我假设这是特定于 Form (或 List)的,因为如果我在“正常”设置中的文本字段旁边使用按钮,则不会发生这种情况。

我的代码有问题吗?这是预期的行为吗?

【问题讨论】:

【参考方案1】:

我不确定为什么边框变得可点击,但作为一种解决方法,我使用了plainButtonStyle,这似乎解决了这个问题,并保持功能完好。

struct TestView: View 
    @State private var endAmount: CGFloat = 0
    @State private var recipeViewModel = ["abc","Deef"]
    var body: some View 
        NavigationView 
            Form 
                Section(header: Text("Instructions")) 
                    InstructionsSectionView(instructions: $recipeViewModel)
                
                
            
        
    


struct InstructionsSectionView: View 
    @Binding var instructions: [String]
    var body: some View 
        ForEach(instructions.indices, id: \.self)  index in
            HStack 
                TextField("Instruction", text: $instructions[index])
                 Spacer()
                if(index == instructions.count-1) 
                   
                addInstructionButton
                    .buttonStyle(PlainButtonStyle())
                    .foregroundColor(.blue)
                
            
        
    
    
    var addInstructionButton: some View 
        Button(action: 
            instructions.append("")
        ) 
            Image(systemName: "plus.circle.fill")
               
        
    

【讨论】:

非常感谢,这解决了问题。奇怪的是,为什么在没有修饰符的情况下会发生这种情况......

以上是关于SwiftUI:表单中的按钮的主要内容,如果未能解决你的问题,请参考以下文章

具有多个编辑按钮的 SwiftUI 表单

为啥 SwiftUI“表单”会导致我的按钮转到屏幕底部?

SwiftUI - 带有可点击按钮的单元格(在表单内)

使用表单 SwiftUI 的导航链接

Swiftui 按钮动作功能

SwiftUI - 我可以在按钮操作中使用完成处理程序吗?