【问题标题】:SwiftUI - Ternary operator on padding modifier crashes programSwiftUI - 填充修饰符崩溃程序上的三元运算符
【发布时间】:2022-10-25 19:55:14
【问题描述】:

我在 SwiftUI 中有一个 ZStack,其中填充了 ForEach 提供的一些组件,如下所示:

ForEach(0..<arr.count) { i in
  ZStack {
    ...
  }

  // I use i later in this code
  ...
}

程序就这样完美运行。

但我只想在i == 0 时才向ZStack 添加填充,所以我尝试将此修饰符添加到ZStack:.padding(.top, i == 0 ? 70 : 0)

当我尝试使用此修饰符构建它时,它失败了,但甚至没有说“构建失败”。尝试构建大约需要 5 分钟(通常需要 5 秒)然后决定崩溃。谁能解释为什么会发生这种情况以及如何在不破坏程序的情况下获得此条件填充?

【问题讨论】:

  • 类型检查过多。尝试将结果(70 和 0)分别包装在 CGFloat() 中,您也许可以使其正常工作。编译器必须猜测类型的代码点越多,它在主体中的三元运算就越慢,这是臭名昭著的减速,因为主体经常试图猜测。另一种选择是将代码移动到子视图,甚至可能是视图模型,以从正文中获取计算。远离索引使用。
  • 与您的问题没有直接关系,但请记住,不建议将ForEach 与这样的范围和数组一起使用,并且可能会导致运行时崩溃。如果您想要一个相对简单且更安全的替代品,请查看.enumerated()
  • @jnpdx 如果我在没有范围的情况下需要它,我如何才能访问索引?
  • 查看.enumerated()

标签: swiftui padding modifier


【解决方案1】:

尝试这个:

ForEach(0..<arr.count) { i in
  ZStack {
    ...
  }
  .padding(.top, getPadding(i))

  // I use i later in this code
  ...
}
func getPadding(_ i: Int) -> CGFloat {
        if i == 0 {
                return CGFloat(70)
        }
            
        return CGFloat(0)
}

【讨论】:

    【解决方案2】:
    func setPadding(_ statement: String) -> CGFloat {
    if statement == " Put your statement " {
            return CGFloat(your requirement padding)
    } else {
    return CGFloat("According to your requirement padding")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2013-07-04
      相关资源
      最近更新 更多