【问题标题】:typealias LazyVStack for iOS 13适用于 iOS 13 的 typealias LazyVStack
【发布时间】:2020-08-02 15:52:44
【问题描述】:

我有一个 SwiftUI 应用程序,我想保持对 iOS 13 的支持,但在 iOS 14 上我想使用新的 LazyVStackLazyHStack。我在想typealias 非常适合这个,但不确定如何正确设置它,所以别名在 iOS 13 上使用,而不是在 14 上。我试过这个,但相信这会使别名在 iOS 上可用13 及更高版本,因此也将其包含在 iOS 14 中。

有没有办法将可用性设置为仅适用于 iOS 13?或者有更好的方法吗?

@available(iOS 13.0, *)
typealias LazyVStack = VStack

【问题讨论】:

  • 当然有一种方法可以设置 iOS 13 的可用性;您将其设置为 iOS 14 以获取 if,然后将 else 用于 iOS 13。但我认为这不会帮助您使用某种类型别名技巧。您应该以愚蠢的方式执行此操作:两组代码。即使是超人也必须一次只穿一条腿。

标签: swift swiftui


【解决方案1】:

这是可以用作常规堆栈容器的可能包装器

struct CompatibleVStack<Content> : View where Content : View {
    let alignment: HorizontalAlignment
    let spacing: CGFloat?
    let content: () -> Content

    init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil,
            @ViewBuilder content: @escaping () -> Content) {
        self.alignment = alignment
        self.spacing = spacing
        self.content = content
    }

    var body: some View {
      Group {
        if #available(iOS 14, *) { // << add more platforms if needed
            LazyVStack(alignment: alignment, spacing: spacing, pinnedViews: [], content:content)
        } else {
            VStack(alignment: alignment, spacing: spacing, content:content)
        }
      }
    }
}

【讨论】:

  • 谢谢!希望这可以用 typealias 来完成,但这个剂量似乎是最好的解决方案。
  • 我在 iOS 13 上运行时遇到了此代码崩溃,我不得不将 VStack 或 LazyVStacks 包装在 AnyView 中
  • 尝试将正文中的条件包装到更新后的组中(而不是使用 AnyView)
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2021-06-09
  • 2020-02-09
  • 2020-06-09
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多