SwiftUI 列表禁用单元格按下

标签 swift swiftui ios13 swiftui-list

我正在使用带有 SwiftUI 的 xCode 11 beta 7。

我有一个简单的列表,每个列表元素都有几个按钮。当前,当用户按下单元格(而不是按钮)时,它会突出显示列表单元格的背面(可能不是 SwiftUI 的正确术语)。

如何禁用此行为?我找不到明显的 API 来禁用它。

List {
    HStack {
        Group {
            Button(action: {}) {
                Text("Read").padding(5)
            }.onTapGesture {
                print("1")                    
            }
            .padding()
            .background(Color.blue)
            .cornerRadius(5)
        }
        Group {
            Button(action: {}) {
                Text("Notify").padding(5)
            }.onTapGesture {
                print("2") 
            }
            .padding()
            .background(Color.purple)
            .cornerRadius(5)
        }
        Group {
            Button(action: {}) {
                Text("Write").padding(5)
            }.onTapGesture {
                print("3")
            }
            .padding()
            .background(Color.yellow)
            .cornerRadius(5)
        }
    }
}

最佳答案

Same answer as in How to remove highlight on tap of List with SwiftUI?

我知道我有点晚了,但这是给那些正在寻找的人(比如我😇)

我发现了什么

我想你应该看看这篇短文How to disable the overlay color for images inside Button and NavigationLink来自 @TwoStraws

只需将 .buttonStyle(PlainButtonStyle()) 修饰符添加到 List 中的项目,您就会得到想要的东西。它还使 ButtonList 中再次工作,这是我遇到的另一个问题。

Swift 5.1 的工作示例:

import Combine
import SwiftUI

struct YourItem: Identifiable {
    let id = UUID()
    let text: String
}

class YourDataSource: ObservableObject {
    let willChange = PassthroughSubject<Void, Never>()
    var items = [YourItem]()

    init() {
        items = [
            YourItem(text: "Some text"),
            YourItem(text: "Some other text")
        ]
    }
}

struct YourItemView: View {
    var item: YourItem

    var body: some View {
        VStack(alignment: .leading) {
            Text(item.text)
            HStack {
                Button(action: {
                    print("Like")
                }) {
                    Image(systemName: "heart.fill")
                }
                Button(action: {
                    print("Star")
                }) {
                    Image(systemName: "star.fill")
                }
            }
        }
        .buttonStyle(PlainButtonStyle())
    }
}

struct YourListView: View {
    @ObservedObject var dataSource = YourDataSource()

    var body: some View {
        List(dataSource.items) { item in
            YourItemView(item: item)
        }
        .navigationBarTitle("List example", displayMode: .inline)
        .edgesIgnoringSafeArea(.bottom)
    }
}

#if DEBUG
struct YourListView_Previews: PreviewProvider {
    static var previews: some View {
        YourListView()
    }
}
#endif

如文章中所述,它也适用于 NavigationLink。我希望它对你们中的一些人有所帮助🤞🏻

关于SwiftUI 列表禁用单元格按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57769895/

相关文章:

arrays - swift reversed 的时间复杂度是多少?

swift - 为什么这不会打开导航 Controller 窗口?

iphone - 视频正在旋转 180 度,但使用 swift 视频没有完全显示在框架中

SwiftUI 拖放列表

swift - 有没有办法在 SwiftUI 中的 NavigationLink 内的 isActive 参数中提供 bool 语句?

swift 5 中的 Alamofire 请求

ios - 由于错误代码 1580,Swift Coredata 无法保存

swiftui - 当Live Activity更新数据时,图片会淡入淡出,如何关闭这个动画效果?

swift - UIButton 的 iOS 13 系统颜色

swift - 如何为 NSPersistentContainer 和 NSPersistentCloudKitContainer 创建同名但根据版本设置的变量?