gpt4 book ai didi

ios - SwiftUI NavigationLink push in onAppear 使用@ObservableObject 时立即弹出 View

转载 作者:行者123 更新时间:2023-12-01 16:05:24 25 4
gpt4 key购买 nike

我希望能够以编程方式导航到 List 中的链接的 NavigationLinks当 View 出现时(从推送通知构建深度链接)。我有一个字符串 -> Bool 字典,它绑定(bind)到自定义 Binding<Bool>在我看来。当 View 出现时,我设置 bool 属性,导航发生,但是,它立即弹回。我按照 SwiftUI NavigationLink immediately navigates back 中的答案进行操作并确保 List 中的每个项目具有唯一标识符,但问题仍然存在。

两个问题:

  • 我的绑定(bind)逻辑在这里正确吗?
  • View 怎么会立即弹回来?
  • import SwiftUI

    class ContentViewModel: ObservableObject {
    @Published var isLinkActive:[String: Bool] = [:]
    }

    struct ContentViewTwo: View {
    @ObservedObject var contentViewModel = ContentViewModel()
    @State var data = ["1", "2", "3"]
    @State var shouldPushPage3: Bool = true

    var page3: some View {
    Text("Page 3")
    .onAppear() {
    print("Page 3 Appeared!")
    }
    }

    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 3 Link with Data: \(data)")
    }.onAppear() {
    print("link appeared")
    }
    }.onAppear() {
    print ("ContentViewTwo Appeared")
    if (self.shouldPushPage3) {
    self.shouldPushPage3 = false
    self.contentViewModel.isLinkActive["3"] = true
    print("Activating link to page 3")
    }
    }
    }
    }

    struct ContentView: View {
    var body: some View {
    return NavigationView() {
    VStack {
    Text("Page 1")
    NavigationLink(destination: ContentViewTwo()) {
    Text("Page 2 Link")
    }
    }
    }
    }
    }

    最佳答案

    该错误是由于 ViewModel 的生命周期造成的,并且是目前 SwiftUI NavigationLink 本身的限制,将不得不等待 Apple 是否在下一个版本中更新未决问题。
    SwiftUI 2.0 的更新:
    改变:

    @ObservedObject var contentViewModel = ContentViewModel()
    到:
    @StateObject var contentViewModel = ContentViewModel()
    @StateObject表示 View 模型状态的变化不会触发整个 body 的重绘.
    您还需要存储 shouldPushPage3 View 之外的变量因为每次弹回根目录时都会重新创建 View View .
    enum DeepLinking {
    static var shouldPushPage3 = true
    }
    并引用如下:
    if (DeepLinking.shouldPushPage3) {
    DeepLinking.shouldPushPage3 = false
    self.contentViewModel.isLinkActive["3"] = true
    print("Activating link to page 3")
    }
    该错误得到 使用最新的 SwiftUI 版本修复 .但目前要使用此代码,您将需要使用 Xcode 和 iOS 14 的 beta 版本——它将在一个月左右的时间与下一个 GM Xcode 版本一起使用。

    关于ios - SwiftUI NavigationLink push in onAppear 使用@ObservableObject 时立即弹出 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62275502/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com