💡
原文中文,约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。
➡️