有意为之还是技术缺陷?SwiftUI 多层导航中的 onChange 异常

有意为之还是技术缺陷?SwiftUI 多层导航中的 onChange 异常

💡 原文中文,约3400字,阅读约需9分钟。
📝

内容提要

SwiftUI 的 onChange 修饰器在某些导航层级下未能正常触发,导致开发者困惑。测试显示,只有最顶层和最底层视图的 onChange 被调用,而中间层的 onChange 失效。在 macOS 上一切正常,但在 iOS 中,这可能是一个长期存在的 Bug。

🎯

关键要点

  • SwiftUI 的 onChange 修饰器在某些导航层级下未能正常触发,导致开发者困惑。
  • 在 NavigationStack 中,只有最顶层和最底层视图的 onChange 被调用,中间层的 onChange 失效。
  • 在 macOS 上一切正常,但在 iOS 中,这可能是一个长期存在的 Bug。
  • 开发者 Eric0625 发现了 onChange 异常行为,RootView、MiddleView 和 TopView 的 onChange 行为不一致。
  • 经过测试,确认这一现象在不同版本的 Xcode 和 iOS 系统中普遍存在。
  • 无论导航方式如何,onChange 的异常现象始终存在。
  • 通过系统性的排查,发现问题可能与导航层级的数量有关。
  • 在导航层级为一层或两层时,onChange 能正常触发,但三层及以上时仅最底层和最顶层的 onChange 被触发。
  • 使用 task(id:) 替代 onChange 后,发现仅最顶层视图的 task(id:) 被触发。
  • 使用 onReceive 替代 onChange 和 task(id:) 后,所有层级的 onReceive 都能准确响应变化。
  • 总结出导航堆栈中不同层级视图的响应规律:只有最底层和最顶层视图的 onChange 会被触发。
  • 在 macOS 中,所有层级的 onChange 和 task(id:) 都能正常调用,表明 iOS 中的异常现象可能是 Bug。
➡️

继续阅读