最好在行中使用泛型,如下所示(已通过Xcode 11.4测试)
用法示例:
ProductFamilyRow(item: ProductFamilyItem(title: "Test"),
destinationView1: { Text("Details1") },
destinationView2: { Text("Details2") })
接口:
更新 -为行突出显示添加了块。列表自动检测 行内的按钮或链接,并突出显示是否存在任何标准(!键)。因此, 要禁用此类行为,需要将所有内容隐藏在自定义按钮 样式下。
struct ProductFamilyRowStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.colorMultiply(configuration.isPressed ?
Color.white.opacity(0.5) : Color.white) // any effect you want
}
}
struct ProductFamilyRow<D1: View, D2: View>: View {
let item: ProductFamilyItem
let destinationView1: () -> D1
let destinationView2: () -> D2
init(item: ProductFamilyItem, @ViewBuilder destinationView1: @escaping () -> D1,
@ViewBuilder destinationView2: @escaping () -> D2)
{
self.item = item
self.destinationView1 = destinationView1
self.destinationView2 = destinationView2
}
@State private var selection: Int? = 0
var body: some View {
VStack {
HStack {
Text(item.title)
Button(action: {
self.selection = 1
}) {
Text("Destination 1")
.background( // hide link inside button !!
NavigationLink(destination: destinationView1(),
tag: 1, selection: self.$selection) { EmptyView() }
)
}.foregroundColor(Color.blue)
Button(action: {
self.selection = 2
}) {
Text("Destination 2")
.background(
NavigationLink(destination: destinationView2(),
tag: 2, selection: self.$selection) { EmptyView() }
)
}.foregroundColor(Color.blue)
}
//Image(item.image)
}.frame(maxWidth: .infinity) // to have container centered
.buttonStyle(ProductFamilyRowStyle())
}
}