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

Posted

技术标签:

【中文标题】SwiftUI - 带有可点击按钮的单元格(在表单内)【英文标题】:SwiftUI - cells (inside Form) with clickable buttons 【发布时间】:2019-06-22 12:51:14 【问题描述】:

目标:

    使用按钮创建行/单元格 在表单中嵌入行/单元格

我做了什么:

    我创建了一个带有按钮的单元格。
struct PointTypeButtons : View 
    var body: some View 
        
        VStack 
            HStack 
                Text("Aligment")
                    .font(.subheadline)
                Spacer()
            
            
            HStack 
                
                Button(action: ) 
                    Image(systemName: "text.alignleft")
                        .padding(.horizontal, 25.0)
                        .padding(.vertical)
                        .background(Color.black)
                        .cornerRadius(4)
                
                Button(action: ) 
                    Image(systemName: "text.aligncenter")
                        .padding(.horizontal, 25.0)
                        .padding(.vertical)
                        .background(Color.black)
                        .cornerRadius(4)
                
                Button(action: ) 
                    Image(systemName: "text.aligncenter")
                        .padding(.horizontal, 25.0)
                        .padding(.vertical)
                        .background(Color.black)
                        .cornerRadius(4)
                
                Button(action: ) 
                    Image(systemName: "text.alignright")
                        .padding(.horizontal, 25.0)
                        .padding(.vertical)
                        .background(Color.black)
                        .cornerRadius(4)
                
            
        
        .frame(height: nil)
    

    然后我将这个单元格放入一个表单中:
struct ToolbarBezier : View 
    var body: some View 
        HStack 
            Spacer()
            
            Form 
                PointTypeButtons()
            
            .frame(width: 320.0)
            
        
    

问题: 当我点击时,我现在选择整个单元格,而不是按钮。

问题: 如何点击并选择按钮? 我应该公开表单上的所有按钮(不是单元格)吗?问题是,在这种情况下,表单将拥有庞大的代码库,而我希望保持整洁有序...

【问题讨论】:

【参考方案1】:

从 beta 5 开始,SwiftUI 会将任何包含 ButtonView 视为“表单按钮”。这意味着整个单元格成为可点击的目标。根据我的经验,如果您有多个按钮,它似乎会选择最后一个按钮。

要解决此问题,您可以选择根本不使用按钮。相反,使用onTapGesture() 事件来检测点击。

这是您相同的图像按钮,但已转换为可点击的图像。前景色来自按钮样式,因此您现在必须明确定义。

Image(systemName: "text.alignleft")
    .foregroundColor(Color.accentColor)
    .padding(.horizontal, 25.0)
    .padding(.vertical)
    .background(Color.black)
    .cornerRadius(4)
    .onTapGesture 
        print("align left tapped")
    

【讨论】:

啊,真烦人!【参考方案2】:

只需添加到您的视图(PointTypeButtons),并会识别表单内的每个按钮点击

.buttonStyle(PlainButtonStyle())

【讨论】:

谢谢,它可以工作,但是按钮的颜色将是黑色而不是默认的蓝色。我将样式更改为无边框按钮样式,它现在显示默认的蓝色样式。使用 xcode 12 在 ios 13,14 上测试。 这实际上应该是公认的答案,因为您仍然可以使用“按钮”。

以上是关于SwiftUI - 带有可点击按钮的单元格(在表单内)的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 列表中的自定义按钮

SwiftUI:带有onTapGesture的列表单元格内的菜单触发手势

使带有删除按钮的 UITableView 对所有单元格可见

SwiftUI 列表禁用单元格按下

点击单元格显示下面的视图

SwiftUI - 带有静态单元格的 QGrid