使用@ObservableObject

时间:2020-06-09 05:16:55

标签: ios swift swiftui-navigationlink swiftui

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

两个问题:

  1. 这里的绑定逻辑正确吗?
  2. 视图如何立即弹出?
List

2 个答案:

答案 0 :(得分:2)

该错误是由于ViewModel的生命周期引起的,并且目前是SwiftUI NavigationLink本身的一个限制,将不得不等待看看Apple是否在下一版本中更新了未解决的问题。

SwiftUI 2.0的更新:

更改:

@ObservedObject var contentViewModel = ContentViewModel()

收件人:

@StateObject var contentViewModel = ContentViewModel()

@StateObject意味着视图模型状态的更改不会触发整个body的重绘。

您还需要将shouldPushPage3变量存储在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版本中启用约一个月。

答案 1 :(得分:2)

我遇到了这个问题,使用标准(不使用“isActive”)NavigationLink - 对我来说,问题是使用视图修饰符:.onAppear{code} 和 .onDisappear{code} < strong>在目标视图中。我认为这是导致重新绘制循环或导致视图弹回我的列表视图的东西(大约 1 秒后)。 我通过将修饰符移动到目标视图中不受这些修饰符中的代码影响的部分解决了这个问题。