SwiftUI:NavigationLink在列表中时始终处于激活状态



List中,我无法阻止SwiftUINavigationLink被激活,我有一段简单的代码,在决定是否显示详细信息页面之前,我需要进行某种业务检查(在现实世界的应用程序中,按钮的操作中可能会发生一些业务逻辑(:

struct ContentView: View {
@State var showDetail = false
var body: some View {
NavigationView {
List {
Text("Text 1")
Text("Text 2")
Text("Text 3")
NavigationLink(destination: DetailView(), isActive: $showDetail) {
LinkView(showDetails: $showDetail)
}
}
}
}
}
struct LinkView: View {
@Binding var showDetails: Bool
var body: some View {
Button(action: {
self.showDetails = false
}) {
Text("Open Details")
}
}
}
struct DetailView: View {
var body: some View {
Text("Detail View")
}
}

在这种情况下,如何阻止导航链接打开详细信息页面?这是SDK中的错误吗?

p.s.XCode版本:13.3.1和iOS版本(实际设备(:13.3.1

编辑

我不能用ScrollView代替List,因为我的真实应用程序中有一个ForEach项目列表,所以考虑使用ScrollView时不要发布答案。

在现实世界的应用程序中,内部可能会发生一些业务逻辑按钮的动作

似乎有点像。您可以简单地有条件地禁用链接(并通过视觉外观通知用户链接不可用(

NavigationLink(...).disabled(onCondition)

其中

func disabled(_ disabled: Bool) -> some View

参数

禁用

一个布尔值,用于确定用户是否可以与此视图交互。

返回值

控制用户是否可以与此视图交互的视图。

讨论

视图层次结构中较高的视图可以覆盖您在此视图上设置的值。在下面的例子中,按钮不是交互式的,因为外部禁用的(_:(修饰符覆盖内部的:

HStack {
Button(Text("Press")) {}
.disabled(false)
}
.disabled(true)

如果我正确理解了你的目标,它可以是如下

List {
Text("Text 1")
Text("Text 2")
Text("Text 3")
LinkView(showDetails: $showDetail)
.background(
NavigationLink(destination: DetailView(), isActive: $showDetail) { EmptyView() })
}

struct LinkView: View {
@Binding var showDetails: Bool
var body: some View {
Button(action: {
self.showDetails = true // < activate by some logic
}) {
Text("Open Details")
}
}
}

如果使用.disable(true(,它将像禁用按钮一样降低列表项的不透明度,以防止这种情况发生。使用以下代码样式。使用backGround中的导航链接,并在视图的轻触手势上检查您的导航条件。

VStack{
List(0..<yourListArray.count, id: .self) { index in  
{
Text("(yourListArr[index].firstName)")
}().onTapGesture{
let jobType = getFlags(jobsArr: yourListArray, index:index) 
if jobType.isCancelledFlag == true{
self.shouldNavigate = false
}else{
self.shouldNavigate = true
}
}//Tap Gesture End
.background(NavigationLink(destination: YourDestinationView(),isActive: self.$shouldNavigate) {
}.hidden())}}//vStack

最新更新