具有基于字典的自定义绑定的 SwiftUI NavigationLink 在过渡回来后无法重置
SwiftUI NavigationLink with custom binding based on dictionary fails to reset after transitioning back
我有一个存储字符串 -> 布尔值的字典,在我看来,我将这个字典包裹在一个 Binding<Bool>
周围,以便能够存储每个 NavigationLink
的状态,以便以后能够以编程方式导航。现在,这是第一次工作,第 1 页 -> 第 2 页 -> 第 3 页,但是当你回到第 2 页时,导航停止工作。
我已经检查过 isLinkActive
词典的值在点击 NavigationLink
时确实得到了正确更新,但是,NavigationLink
没有被激活。
import SwiftUI
class ContentViewModel: ObservableObject {
@Published var isLinkActive:[String: Bool] = [:]
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
var page3: some View {
Text("Page 3")
}
@State var data = ["1", "2", "3"]
func binding(chatId: String) -> Binding<Bool> {
return .init(get: { () -> Bool in
return self.contentViewModel.isLinkActive[chatId, default: false]
}) { (value) in
self.contentViewModel.isLinkActive[chatId] = value
}
}
var page2: some View {
return
List(data, id: \.self) { data in
NavigationLink(destination: self.page3, isActive: self.binding(chatId: data)) {
Text("Page \(data) Link")
}
}
}
var body: some View {
return NavigationView() {
VStack {
Text("Page 1")
NavigationLink(destination: page2) {
Text("Page 2 Link")
}
}
}
}
}
你的代码逻辑没有问题。唯一的问题是 SwiftUI 不会 重绘 page2
因为它只在 onAppear
期间重绘 var body
并且这个视图不在上下文中.因此,强制刷新的方法是使 page2
成为主体变量。
struct ContentView: View {
var body: some View {
return NavigationView() {
VStack {
Text("Page 1")
NavigationLink(destination: ContentViewTwo()) {
Text("Page 2 Link")
}
}
}
}
}
struct ContentViewTwo: View {
@ObservedObject var contentViewModel = ContentViewModel()
var page3: some View {
Text("Page 3")
}
@State var data = ["1", "2", "3"]
func binding(chatId: String) -> Binding<Bool> {
return .init(get: { () -> Bool in
return self.contentViewModel.isLinkActive[chatId, default: false]
}) { (value) in
self.contentViewModel.isLinkActive[chatId] = value
}
}
var body: some View {
return
List(data, id: \.self) { data in
NavigationLink(destination: self.page3, isActive: self.binding(chatId: data)) {
Text("Page \(data) Link")
}
}
}
}
我有一个存储字符串 -> 布尔值的字典,在我看来,我将这个字典包裹在一个 Binding<Bool>
周围,以便能够存储每个 NavigationLink
的状态,以便以后能够以编程方式导航。现在,这是第一次工作,第 1 页 -> 第 2 页 -> 第 3 页,但是当你回到第 2 页时,导航停止工作。
我已经检查过 isLinkActive
词典的值在点击 NavigationLink
时确实得到了正确更新,但是,NavigationLink
没有被激活。
import SwiftUI
class ContentViewModel: ObservableObject {
@Published var isLinkActive:[String: Bool] = [:]
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
var page3: some View {
Text("Page 3")
}
@State var data = ["1", "2", "3"]
func binding(chatId: String) -> Binding<Bool> {
return .init(get: { () -> Bool in
return self.contentViewModel.isLinkActive[chatId, default: false]
}) { (value) in
self.contentViewModel.isLinkActive[chatId] = value
}
}
var page2: some View {
return
List(data, id: \.self) { data in
NavigationLink(destination: self.page3, isActive: self.binding(chatId: data)) {
Text("Page \(data) Link")
}
}
}
var body: some View {
return NavigationView() {
VStack {
Text("Page 1")
NavigationLink(destination: page2) {
Text("Page 2 Link")
}
}
}
}
}
你的代码逻辑没有问题。唯一的问题是 SwiftUI 不会 重绘 page2
因为它只在 onAppear
期间重绘 var body
并且这个视图不在上下文中.因此,强制刷新的方法是使 page2
成为主体变量。
struct ContentView: View {
var body: some View {
return NavigationView() {
VStack {
Text("Page 1")
NavigationLink(destination: ContentViewTwo()) {
Text("Page 2 Link")
}
}
}
}
}
struct ContentViewTwo: View {
@ObservedObject var contentViewModel = ContentViewModel()
var page3: some View {
Text("Page 3")
}
@State var data = ["1", "2", "3"]
func binding(chatId: String) -> Binding<Bool> {
return .init(get: { () -> Bool in
return self.contentViewModel.isLinkActive[chatId, default: false]
}) { (value) in
self.contentViewModel.isLinkActive[chatId] = value
}
}
var body: some View {
return
List(data, id: \.self) { data in
NavigationLink(destination: self.page3, isActive: self.binding(chatId: data)) {
Text("Page \(data) Link")
}
}
}
}