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()是最好的方法。