我在 SwiftUI 中大量使用条件 View 修饰符,直到遇到一些问题和 recently discovered it is a bad idea .
根据我现在的理解,做这样的事情:
if condition {
view
} else {
view.hidden()
}
意味着 SwiftUI 会将两种情况下的 view
视为完全不同的 View 。因此,如果您从 if 跳转到 else,反之亦然,则会重新创建 View ,包括运行 onAppear
和任何初始动画。除此之外,它还将动画 view
从一个分支中断到另一个分支。即使添加 .id()
似乎也无法解决这个问题。
我附上了 minimum viable example所以你可以亲眼看到这种行为。不用说,这很糟糕。它会对性能产生重大影响,破坏动画,如果您在 onAppear
中执行一些繁重的操作(如网络请求),情况会更糟。
解决方案似乎是做这样的事情:
view.padding(condition? 10 : 0)
一切正常,SwiftUI 保持 view
存在,太棒了。
现在,我需要有条件地隐藏一个 View 。老实说,我不知道如何实现它。 .isHidden()
没有启用或禁用它的参数,因此无法使用与上面所示相同的方法。
那么:如何有条件地隐藏 View 而不重新创建它?我不想重新创建 View 的原因是 onAppear
被再次调用并重置 View 的状态,再次将动画触发到初始状态。还是我在这里的 SwiftUI 世界中完全使用了错误的方法?
最佳答案
一种可能的方法是使用opacity+disabled,比如
view
.opacity(isHidden ? 0 : 1)
.disabled(isHidden ? true : false)
https://stackoverflow.com/questions/72908044/