【问题标题】:SwiftUI - Two buttons in a ListSwiftUI - 列表中的两个按钮
【发布时间】:2019-10-27 19:12:08
【问题描述】:

我在一个列表中有两个按钮,当点击时,列表项的整个区域都会突出显示。有没有办法分开两个按钮?

在这种情况下,我有一个操作按钮和一个信息按钮:

我找到了this question,但没有直接的解决方案。

代码如下:

var body: some View {
    HStack {
        Text(control.name)
        Spacer()
        Button(action: {
            print("action")
        }) {
            Text("Action")
            }
            .frame(width: 250 - 10)
            .padding(5)
            .background(Color(white: 0.9))
            .cornerRadius(10)
            .frame(width: 250)
        Group {
            Button(action: {
                print("action")
            }) {
                Image(systemName: "info.circle")
                    .foregroundColor(.accentColor)
            }
        }
    }
}

【问题讨论】:

  • 我认为还没有办法做到这一点 - 作为一种临时解决方法,您可以将列表替换为 HStack 的 ForEach,其中 HStack 将是您的行内容.请注意,样式不会相同 - List 在这个意义上更精致。
  • @Fogmeister 该解决方案使用 .tapAction,一个有效的解决方案,但高亮状态丢失了..
  • @Fogmeister 我将它与信息图像的一个按钮和一个 tapAction 相结合,这是目前可行的解决方案。
  • 试试 .buttonStyle(BorderlessButtonStyle())

标签: swift swiftui


【解决方案1】:

将按钮样式设置为不同于默认的样式,例如 BorderlessButtonStyle()

struct Test: View {
  var body: some View {
    NavigationView {
      List {
        ForEach([
          "Line 1",
          "Line 2",
        ], id: \.self) {
          item in
          HStack {
            Text("\(item)")
            Spacer()
            Button(action: { print("\(item) 1")}) {
              Text("Button 1")
            }
            Button(action: { print("\(item) 2")}) {
              Text("Button 2")
            }
          }
        }
        .onDelete { _ in }
        .buttonStyle(BorderlessButtonStyle())
      }
      .navigationBarItems(trailing: EditButton())
    }
    .accentColor(.red)
  }
}

【讨论】:

  • .buttonStyle(BorderlessButtonStyle()) 做到了!谢谢!
  • 也为我工作。谁会想到“造型”修饰符会解决交互问题!喜欢 SwiftUI,但这确实让人感觉不直观。
  • 你真是个救世主,我觉得 SwiftUI 需要改进很多
【解决方案2】:

我在这个问题上挣扎了一段时间。 Apple 在 SwiftUI 中使 Button 变得特别。它可以根据使用的上下文而改变。这就是为什么当Button 在List 中时我们会看到这种奇怪的功能。

幸运的是,还有其他方法可以使用 .tapAction 或 TapGesture。试试下面的代码。

var body: some View {
    HStack {
        Text(control.name)
        Spacer()
        Text("Action")
            .frame(width: 250 - 10)
            .padding(5)
            .background(Color(white: 0.9))
            .cornerRadius(10)
            .frame(width: 250)
            .tapAction {
                print("action1")
            }

        Image(systemName: "info.circle")
            .foregroundColor(.accentColor)
            .tapAction {
                print("action2")
            }
    }
}

或

var body: some View {
    HStack {
        Text(control.name)
        Spacer()
        Text("Action")
            .frame(width: 250 - 10)
            .padding(5)
            .background(Color(white: 0.9))
            .cornerRadius(10)
            .frame(width: 250)
            .gesture(TapGesture().onEnded() {
                print("action1")
                })

        Image(systemName: "info.circle")
            .foregroundColor(.accentColor)
            .gesture(TapGesture().onEnded() {
                print("action2")
            })
    }
}

【讨论】:

  • 谢谢,它有效!不知道如何在向下和向上事件中突出显示按钮,您知道如何实现这一点吗?
  • 在最新版的SwiftUI中tapAction变成了onTapGesture
【解决方案3】:

对于与最新 SwiftUI (Xcode 11.2) 和 HStack 中的多个 Buttons 有类似问题的任何人,我只有在转换 @987654323 中的 all 按钮后才能解决我的问题@ 到 Images 并添加 .onTapGesture 处理程序。

我的问题是点击一个按钮会触发HStack 中的所有其他按钮。只有在我将所有按钮都转换为图像之后,它们才停止相互干扰。

当然,如果你的按钮没有图片,你可以使用Text来代替。

【讨论】:

  • 列表行中的按钮也存在问题,点击列表中的任意位置会触发其中一个按钮操作,但向每个按钮添加 .buttonStyle(PlainButtonStyle()) 有助于将点击区域限制为实际按钮本身。
  • 在 HStack 中遇到了同样的问题。文本有效,但您当然不会获得默认样式。奇怪的错误...假设这将在 Xcode 的下一个版本中修复。谢谢
【解决方案4】:

在 Xcode 12.5 上,我在 SwiftUI 中遇到了同样的问题,点击时会突出显示列表项的整个区域。

.buttonStyle(BorderlessButtonStyle()) 完成这项工作,现在可以在列表项上分别点击两个自定义按钮。

【讨论】:

    【解决方案5】:

    您可以添加padding 或尝试添加Spacer

    添加填充

    HStack {
            Text("Button")
            Spacer()
            Button(action: {
                print("action")
            }) {
                Text("Action")
                }
                .frame(width: 250 - 10)
                .padding(5)
                .background(Color(white: 0.9))
                .cornerRadius(10)
                .frame(width: 250)
            Group {
                Button(action: {
                    print("action")
                }) {
                    Image(systemName: "info.circle")
                        .foregroundColor(.accentColor)
                }
                .padding(15)
            }
        }
    

    添加垫片

    HStack {
            Text("Button")
            Spacer()
            Button(action: {
                print("action")
            }) {
                Text("Action")
                }
                .frame(width: 250 - 10)
                .padding(5)
                .background(Color(white: 0.9))
                .cornerRadius(10)
                .frame(width: 250)
            Spacer()
            Group {
                Button(action: {
                    print("action")
                }) {
                    Image(systemName: "info.circle")
                        .foregroundColor(.accentColor)
                }
            }
        }
    

    【讨论】:

    • 你试过你的代码了吗?,这能解决真正的问题吗?
    猜你喜欢
    • 2023-04-07
    • 2020-04-08
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多