【问题标题】:Using "if #available(iOS 15, *)" within SwiftUI View crashes the app在 SwiftUI 视图中使用“if #available(iOS 15, *)”会使应用程序崩溃
【发布时间】:2021-09-29 00:40:55
【问题描述】:

我正在尝试保留用于在 iOS 14 中删除列表分隔符的代码,同时为 iOS 15 采用新的 .listRowSeparatorVisibility

extension View {
  func listRowModifier(color: Color) -> some View {
    let view = self
      .frame(maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
      .background(color)
    
    if #available(iOS 15, *) {
      return AnyView(
        view
          .listRowSeparatorVisibility(.hidden)
          .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
      )
    } else {
      return AnyView(
        view
          .listRowInsets(EdgeInsets(top: -1, leading: 0, bottom: -1, trailing: 0))
      )
    }
  }
}

这会因EXC_BAD_ACCESS 而崩溃

#0  0x0000000186e84214 in swift_getOpaqueTypeMetadata ()
#1  0x0000000100dc2b50 in View.listRowModifier(color:) ()

视图中这一行的崩溃:

List {
  Spacer().frame(height: headerHeight + Theme.unit(2)).listRowModifier()
  ...
}

我尝试过的其他事情:

  1. 改用 @ViewBuilder 也会崩溃
  2. 直接在视图中执行 if else 而不是使用扩展,也会崩溃

** 更新 **

ifelse 块中返回的视图相同时,它可以工作。如果没有,它会崩溃。我不确定这有什么用处

【问题讨论】:

    标签: swiftui ios15


    【解决方案1】:

    已解决

    问题是 .listRowSeparatorVisibility 在 iOS 15 中已被弃用。我将其更改为 .listRowSeparator 并停止崩溃。

    这一点都不清楚,但我会把它留在这里,以防其他人遇到这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多