肇鑫的技术博客

业精于勤,荒于嬉

使用@Observable替代ObservableObject,解决NavigationView、NavigationSplitView在@ObservedObject下界面回退的问题

长久以来,SwiftUI下的其中的一个坑就是NavigationView,它在使用@ObservedObject时,会出现界面回退的问题。

SwiftUI NavigationView pops back when updating observableObject

我原本以为随着NavigationView被反对,替代为NavigationSplitView和NavigationStack之后,这个问题也就消失了。但是没相当,这个问题在NavigationSplitView中仍旧存在。

实在没办法,我想到是否可以使用@Observable来替代ObservableObject。采用这个办法的主要缺点是前者只有最新一代的系统iOS 17、macOS 14才支持。但是好在我这个涉及到的应用是伴随Xcode发布的。因此,使用我的应用的用户应该主要是使用最新的系统。

从ObservableObject迁移到@Observable还是比较简单的。只需要跟随官方的文档一步一步操作即可。

Migrating from the Observable Object protocol to the Observable macro

不过,这里我还要额外再说两点:

  1. 苹果说@ObservedObject可以直接拿掉。因为Swift会自动管理。但是实际使用中,必须得加上@State,状态才能正常改变。
    1. 也就是说,你可以先拿掉看看,如果不正常,就在前面加个@State。这个是我自己发现的。
  2. 苹果说@Observable的class可以使用@StateObject,这是为了逐步迁移,但是实际上@StateObject并不支持@Observable的class,提示必须得是ObservableObject才行。