ios - SwiftUI:有条件地隐藏 View 而不重新创建它

条件 View 修饰符的问题

我在 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 存在,太棒了。

问题:.isHidden()

现在,我需要有条件地隐藏一个 View 。老实说,我不知道如何实现它。 .isHidden() 没有启用或禁用它的参数,因此无法使用与上面所示相同的方法。

那么:如何有条件地隐藏 View 而不重新创建它?我不想重新创建 View 的原因是 onAppear 被再次调用并重置 View 的状态,再次将动画触发到初始状态。还是我在这里的 SwiftUI 世界中完全使用了错误的方法?

最佳答案

一种可能的方法是使用opacity+disabled,比如

view
  .opacity(isHidden ? 0 : 1)
  .disabled(isHidden ? true : false)

https://stackoverflow.com/questions/72908044/

相关文章:

r - 在 R 中使用 dplyr 包 Lag 函数时有没有办法省略 NA?

databricks - Databricks 中的目录

javascript - 使用 Object.keys() 获取 searchParams

typescript - 将通用 typescript 类型限制为单个字符串文字值,不允许联合

c - 尝试创建一个 C 程序来打印出所有具有有理平方根的数字?

r - 按两个数字对列名称进行排序

java - 是否可以向 OpenAPI 添加方法?

haskell - 在 Haskell 中内存递归函数

xaml - 删除开关中的文本

python - Linux 命令行中 Python 对象类的子类