SwiftUI:NavigationLink 在列表中时始终处于激活状态
SwiftUI: NavigationLink is always activated when in a List
我无法阻止 SwiftUI
的 NavigationLink
在 List
中被激活,我有一段简单的代码,我需要在其中执行某种操作在决定是否显示详细信息页面之前进行业务检查(在真实世界的应用程序中,按钮的操作中可能会发生一些业务逻辑):
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")
}
}
在这种情况下,如何防止导航 link 打开详细信息页面?这是 SDK 中的错误吗?
p.s。 XCode版本:13.3.1
和iOS版本(真实设备):13.3.1
编辑
我无法用 ScrollView
替换列表,因为我的真实应用程序中有一个 ForEach
项目列表,所以不要 post 考虑使用 [=16] 的答案=].
如果我正确理解了你的目标,它可以如下
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")
}
}
}
in a real world app, there might be some business logic happens inside
the button's action
似乎有点alogical.You可以简单地有条件地禁用link(并通知用户,link在视觉上不可用)
NavigationLink(...).disabled(onCondition)
哪里
func disabled(_ disabled: Bool) -> some View
参数
已禁用
一个布尔值,用于确定用户是否可以与该视图交互。
Return 值
控制用户是否可以与该视图交互的视图。
讨论
视图层次结构中较高的视图可以覆盖您在此视图上设置的值。在下面的示例中,按钮不是交互式的,因为外部的 disabled(_:) 修饰符覆盖了内部的修饰符:
HStack {
Button(Text("Press")) {}
.disabled(false)
}
.disabled(true)
我无法阻止 SwiftUI
的 NavigationLink
在 List
中被激活,我有一段简单的代码,我需要在其中执行某种操作在决定是否显示详细信息页面之前进行业务检查(在真实世界的应用程序中,按钮的操作中可能会发生一些业务逻辑):
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")
}
}
在这种情况下,如何防止导航 link 打开详细信息页面?这是 SDK 中的错误吗?
p.s。 XCode版本:13.3.1
和iOS版本(真实设备):13.3.1
编辑
我无法用 ScrollView
替换列表,因为我的真实应用程序中有一个 ForEach
项目列表,所以不要 post 考虑使用 [=16] 的答案=].
如果我正确理解了你的目标,它可以如下
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")
}
}
}
in a real world app, there might be some business logic happens inside the button's action
似乎有点alogical.You可以简单地有条件地禁用link(并通知用户,link在视觉上不可用)
NavigationLink(...).disabled(onCondition)
哪里
func disabled(_ disabled: Bool) -> some View
参数
已禁用
一个布尔值,用于确定用户是否可以与该视图交互。
Return 值
控制用户是否可以与该视图交互的视图。
讨论
视图层次结构中较高的视图可以覆盖您在此视图上设置的值。在下面的示例中,按钮不是交互式的,因为外部的 disabled(_:) 修饰符覆盖了内部的修饰符:
HStack {
Button(Text("Press")) {}
.disabled(false)
}
.disabled(true)