Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI-列表行中的多个按钮_Ios_Swift_Swiftui - Fatal编程技术网

Ios SwiftUI-列表行中的多个按钮

Ios SwiftUI-列表行中的多个按钮,ios,swift,swiftui,Ios,Swift,Swiftui,假设我有一个列表和一行中的两个按钮,如何在整行高亮显示的情况下区分哪个按钮被点击 对于此示例代码,当点击行中的任何一个按钮时,将调用这两个按钮的操作回调 // a simple list with just one row List { // both buttons in a HStack so that they appear in a single row HStack { Button { print("button 1

假设我有一个
列表
和一行中的两个按钮,如何在整行高亮显示的情况下区分哪个按钮被点击

对于此示例代码,当点击行中的任何一个按钮时,将调用这两个按钮的操作回调

// a simple list with just one row
List {

    // both buttons in a HStack so that they appear in a single row
    HStack {
        Button {
            print("button 1 tapped")
        } label: {
            Text("One")
        }
            
        Button {
            print("button 2 tapped")
        } label: {
            Text("Two")
        }
    }
}

// when tapping just once on either button:
// "button 1 tapped"
// "button 2 tapped"

SwiftUI仍处于测试阶段。您应通过反馈助手报告此情况:


很可能是他们系统中的错误

SwiftUI仍处于测试阶段。您应通过反馈助手报告此情况:


很可能是他们系统中的错误

当包含在
列表
行中时,似乎是有关
按钮
的特定问题

解决方法

列表{
HStack{
文本(“一”).ontapposition{print(“一”)}
文本(“两个”).ontapposition{print(“两个”)}
}
}
这将产生所需的输出


您还可以使用
而不是
文本
来对“按钮”进行复杂的设计。

当包含在
列表
行中时,似乎是有关
按钮
的特定问题

解决方法

列表{
HStack{
文本(“一”).ontapposition{print(“一”)}
文本(“两个”).ontapposition{print(“两个”)}
}
}
这将产生所需的输出


您也可以使用
而不是
文本
来对“按钮”进行复杂的设计。

与SwiftUI的区别之一是,您没有创建特定实例,例如UIButton,因为您可能在Mac应用程序中。使用SwiftUI,您需要一个按钮类型的东西

在这种情况下,由于您位于列表行中,系统将为您提供一个完整的大小,点击任意位置以触发操作按钮。由于您添加了其中两个,因此当您点击任意位置时都会触发

您可以添加两个单独的视图,并给它们一个
.ontapsignate
,使它们基本上充当按钮,但您将失去单元格行的点击闪烁以及SwiftUI提供的任何其他自动按钮式功能

列表{
HStack{
文本(“一”).ontaps手势{
打印(“点击按钮1”)
}
垫片()
文本(“两”).ontaps手势{
打印(“点击按钮2”)
}
}
}

与SwiftUI的区别之一是,您没有创建特定的实例,例如UIButton,因为您可能在Mac应用程序中。使用SwiftUI,您需要一个按钮类型的东西

在这种情况下,由于您位于列表行中,系统将为您提供一个完整的大小,点击任意位置以触发操作按钮。由于您添加了其中两个,因此当您点击任意位置时都会触发

您可以添加两个单独的视图,并给它们一个
.ontapsignate
,使它们基本上充当按钮,但您将失去单元格行的点击闪烁以及SwiftUI提供的任何其他自动按钮式功能

列表{
HStack{
文本(“一”).ontaps手势{
打印(“点击按钮1”)
}
垫片()
文本(“两”).ontaps手势{
打印(“点击按钮2”)
}
}
}

您需要创建自己的按钮样式:

  struct MyButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
      configuration.label
        .foregroundColor(.accentColor)
        .opacity(configuration.isPressed ? 0.5 : 1.0)
    }
  }

  struct IdentifiableString: Identifiable {
    let text: String
    var id: String { text }
  }

  struct Test: View {
    var body: some View {
      List([
        IdentifiableString(text: "Line 1"),
        IdentifiableString(text: "Line 2"),
      ]) {
        item in
        HStack {
          Text("\(item.text)")
          Spacer()
          Button(action: { print("\(item.text) 1")}) {
            Text("Button 1")
          }
          Button(action: { print("\(item.text) 2")}) {
            Text("Button 2")
          }
        }
      }.buttonStyle(MyButtonStyle())
    }
  }

您需要创建自己的按钮样式:

  struct MyButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
      configuration.label
        .foregroundColor(.accentColor)
        .opacity(configuration.isPressed ? 0.5 : 1.0)
    }
  }

  struct IdentifiableString: Identifiable {
    let text: String
    var id: String { text }
  }

  struct Test: View {
    var body: some View {
      List([
        IdentifiableString(text: "Line 1"),
        IdentifiableString(text: "Line 2"),
      ]) {
        item in
        HStack {
          Text("\(item.text)")
          Spacer()
          Button(action: { print("\(item.text) 1")}) {
            Text("Button 1")
          }
          Button(action: { print("\(item.text) 2")}) {
            Text("Button 2")
          }
        }
      }.buttonStyle(MyButtonStyle())
    }
  }
您需要使用纯按钮样式()

List([1,2,3],id:\.self){
HStack{
按钮(操作:{打印(“按钮位于\(行)”)}){
文本(“行:\(行)名称:A”)
}
.buttonStyle(无边框buttonStyle())
按钮(操作:{打印(“按钮位于\(行)”)}){
文本(“行:\(行)名称:B”)
}
.buttonStyle(PlainButtonStyle())
}
}
您需要使用普通按钮样式()

List([1,2,3],id:\.self){
HStack{
按钮(操作:{打印(“按钮位于\(行)”)}){
文本(“行:\(行)名称:A”)
}
.buttonStyle(无边框buttonStyle())
按钮(操作:{打印(“按钮位于\(行)”)}){
文本(“行:\(行)名称:B”)
}
.buttonStyle(PlainButtonStyle())
}
}


我想看看是否有一些已经实现的修改器允许实现所需的行为。我想看看是否有一些已经实现的修改器允许实现所需的行为。这听起来像个bug。你应该给它装雷达。这听起来像个虫子。你应该给它装雷达。tapAction不再可用(Xcode 11.2 beta版)。Use.ontapsignature()tapAction不再可用(Xcode 11.2 beta)。实际上,您不需要自定义样式。只需使用
BorderlessButtonStyle()
实际上,您不需要自定义样式。只要使用
BorderlessButtonStyle()
这是最好的解决方案,如果你需要保持按钮动画(突出显示等)完美地满足我的需要,这是一个魅力,但为什么呢?是的。这对我来说是一个真正的世界田联。你是怎么发现的?太好了。它的工作非常完美,即使所有行上都有导航链接。如果您需要保持按钮动画(突出显示等),这是最好的解决方案。这是一个魅力的完美答案,但为什么?是的。这对我来说是一个真正的世界田联。你是怎么发现的?太好了。即使在所有行上都有导航链接,它也能完美地工作。不幸的是,这个错误并不局限于列表中的按钮。我能够在一个HStack中,在一个列表中,通过多个导航链接重现相同的问题。这只是一个解决方法。使用BorderlessButtonStyle()是最好的方法。不幸的是,此错误不限于列表中的按钮。我能够在一个HStack中,在一个列表中,通过多个导航链接重现相同的问题。这只是一个解决方法。使用BorderlessButtonStyle()是最好的方法。