如何使整个列表行成为 SwiftUI 中的 NavigationLink
How to make whole List row a NavigationLink in SwiftUI
我正在制作一个问题集列表,并希望整行导航到下一个视图(每行都有不同的目标视图),但只有文本旁边的区域是可点击的。我尝试在 List 外部创建一个 SetRow() 并且它工作得很好,但是当它在 List 内部时只有空白区域在工作。
Red is the working area
在此处列出代码:
NavigationView {
VStack {
SearchBar(input: $searchInput)
List(viewModel.filterList(by: searchInput)) { setVM in
NavigationLink(destination:
SetView(viewModel: QuestionListViewModel(
emoji: setVM.questionSet.emoji,
title: setVM.questionSet.title,
setID: setVM.questionSet.id)
))
{
SetRow(viewModel: setVM)
}
.onLongPressGesture(minimumDuration: 1) {
selectedSetVM = setVM
showDeleteAlert.toggle()
}
}
.listStyle(PlainListStyle())
}
和此处的 SetRow 代码:
HStack {
Text(viewModel.questionSet.emoji)
.font(.system(size: 50))
VStack(alignment: .leading) {
Text(viewModel.questionSet.title)
.font(.system(size: 20, weight: .semibold, design: .default))
VStack(alignment: .leading) {
Text("Questions: \(viewModel.questionSet.size)")
.font(.system(size: 15, weight: .light, design: .default))
.foregroundColor(.gray)
Text("Updated: \(viewModel.questionSet.lastUpdated, formatter: taskDateFormat)")
.font(.system(size: 15, weight: .light, design: .default))
.foregroundColor(.gray)
}
}
Spacer()
}
.padding(.top, 10)
问题出在您的 'longPressGesture' 上,它想要控制行的内容并监听长按。为避免这种情况,您可以使用 'onTapGesture' 来控制 NavigationLink 的激活,并使用 'onLongPressGesture' 来激活您的 actionSheet 或 Alert。
这是一个演示用法的简短代码示例:
我正在制作一个问题集列表,并希望整行导航到下一个视图(每行都有不同的目标视图),但只有文本旁边的区域是可点击的。我尝试在 List 外部创建一个 SetRow() 并且它工作得很好,但是当它在 List 内部时只有空白区域在工作。
Red is the working area
在此处列出代码:
NavigationView {
VStack {
SearchBar(input: $searchInput)
List(viewModel.filterList(by: searchInput)) { setVM in
NavigationLink(destination:
SetView(viewModel: QuestionListViewModel(
emoji: setVM.questionSet.emoji,
title: setVM.questionSet.title,
setID: setVM.questionSet.id)
))
{
SetRow(viewModel: setVM)
}
.onLongPressGesture(minimumDuration: 1) {
selectedSetVM = setVM
showDeleteAlert.toggle()
}
}
.listStyle(PlainListStyle())
}
和此处的 SetRow 代码:
HStack {
Text(viewModel.questionSet.emoji)
.font(.system(size: 50))
VStack(alignment: .leading) {
Text(viewModel.questionSet.title)
.font(.system(size: 20, weight: .semibold, design: .default))
VStack(alignment: .leading) {
Text("Questions: \(viewModel.questionSet.size)")
.font(.system(size: 15, weight: .light, design: .default))
.foregroundColor(.gray)
Text("Updated: \(viewModel.questionSet.lastUpdated, formatter: taskDateFormat)")
.font(.system(size: 15, weight: .light, design: .default))
.foregroundColor(.gray)
}
}
Spacer()
}
.padding(.top, 10)
问题出在您的 'longPressGesture' 上,它想要控制行的内容并监听长按。为避免这种情况,您可以使用 'onTapGesture' 来控制 NavigationLink 的激活,并使用 'onLongPressGesture' 来激活您的 actionSheet 或 Alert。
这是一个演示用法的简短代码示例: