首页 > 解决方案 > iOS 和 WatchOS 上的不同 .listStyle() 在可重用组件中?

问题描述

我很想在 iOS 和 WatchOS 之间重用列表布局,但InsetGroupedListStyle()在 WatchOS 上不可用。

什么是创建一个有条件地返回InsetGroupedListStyle()iOS 的助手的好方法,例如。PlainListStyle()在 WatchOS 上?

我试过这个,但得到一个我无法返回的错误ListStyle(这可能是由于 SwiftUI 需要在编译时知道特定类型)。

查看.swift

List {
    // ...
}
.listStyle(MyInsetGroupedListStyle())

Helpers.swift

public func MyInsetGroupedListStyle() -> ListStyle {
    #if os(watchOS)
        return PlainListStyle()
    #else
        return InsetGroupedListStyle()
    #endif
}

另一种方法可以是指定 listStyle 内联,但 swift 不支持表达式中的条件编译:

查看.swift

List {
    // ...
}
.listStyle(#if os(watchOS) PlainListStyle() #else InsetGroupedListStyle() #endif)

标签: swiftuiswiftui-list

解决方案


您可以使用 View 上的扩展来实现您想要的。这使您可以listStyle为所需的操作系统添加带有所需参数的修饰符。

extension View {
    public func customListStyle() -> some View {
        #if os(watchOS)
        return self.listStyle(PlainListStyle())
        #else
        return self.listStyle(InsetGroupedListStyle())
        #endif
    }
}

然后你会像这样使用它:

List {
    // items in list go here
}
.customListStyle()

推荐阅读