如何更改列表中的 ListStyle

How to change ListStyle in List

在 SwiftUI 中 List 似乎有一个名为 ListStyle 的 属性。

如何更改列表的样式

struct ListView : View {
var body: some View {
    NavigationView {
    List(Item.create().identified(by: \.id)){ row in
        NavigationButton(destination: DetailsView(item: row)) {
            RowView(item: row)
        }
    }
    .listStyle(StaticMember<PlainListStyle.Member>.self) // error here
    .foregroundColor(.red)
    .navigationBarTitle(Text("List View"))
    .statusBar(hidden: false)
    }
  }
}

ListStyle 协议的遵守方是

  1. CarouselListStyle
  2. 默认列表样式
  3. GroupedListStyle
  4. PlainListStyle
  5. 侧边栏列表样式

但是我正在努力尝试为列表设置新样式 像这样使用它

.listStyle(StaticMember<PlainListStyle.Member>.self)

我尝试了很多方法,但每个确认 ListStyle 的样式都是结构,就像它们不是枚举值

有人知道如何更改 List 的样式吗?

错误Xcode

Cannot convert value of type 'StaticMember.Type' (aka 'StaticMember>.Type') to expected argument type 'StaticMember<_>'

使用:.listStyle(StaticMember<PlainListStyle.Member>)

错误Xcode

Cannot convert value of type '(StaticMember).Type' (aka 'StaticMember>.Type') to expected argument type 'StaticMember<_>'

使用:.listStyle(StaticMember<PlainListStyle()>).listStyle(StaticMember<PlainListStyle.self>)

错误Xcode

'>' is not a postfix unary operator

更新 Xcode 13

因此 Apple 添加了一个扩展,使其语法类似于 Xcode 11 Beta 5 及更低版本:

extension ListStyle where Self == GroupedListStyle {

    /// The list style that describes the behavior and appearance of a grouped
    /// list.
    ///
    /// On iOS, the grouped list style displays a larger header and footer than
    /// the ``ListStyle/plain`` style, which visually distances the members of
    /// different sections.
    public static var grouped: GroupedListStyle { get }
}

所以我们现在可以再次使用它了:

.listStyle(.grouped)

更新 Xcode 11 Beta 5 至 Xcode 12

在 Xcode Beta 5 之后,listStyle(.grouped) 方法被弃用(直到 Xcode 12);现在 Apple 为每种样式创建了一个结构实现。所以你应该这样做: .listStyle(GroupedListStyle())。相同的方法适用于其他可用样式。

pre beta 5 的旧实现

就做.listStyle(.grouped)。对于其他列表样式,请使用

  • .carousel
  • .default
  • .plain
  • .sidebar

基本上您只是将 ListStyle.grouped 传递给该方法,但是由于 swift 类型推断,您不需要指定结构。 每个静态成员都是这样工作的。

StaticMember表示ListStyle协议中有静态成员。声明是这样的

extension StaticMember where Base : ListStyle {

    /// A `ListStyle` that implements the system default grouped `List`
    /// interaction and appearance.
    public static var grouped: GroupedListStyle.Member { get }
}

从 Xcode 11 beta 5 开始,Apple 需要以下内容,简要 概述了 here

.listStyle(GroupedListStyle())

以下是各种样式的细​​分以及它们可以在 iOSwatchOS 之间使用的地方,以及以及它们的推出时间。

iOS 和 watchOS

在 iOS 13 和 watchOS 6 中引入:

  • PlainListStyle

  • ListStyle

  • DefaultListStyle

iOS 仅

引入 iOS 13:

  • GroupedListStyle

引入 iOS 14:

  • InsetGroupedListStyle
  • InsetListStyle
  • SidebarListStyle

这个问题的一些答案还包括特定于 watchOS 的样式,但没有明确标记,尽管问题被标记为 iOS。为了完整性...

仅限 watchOS

随 watchOS 6 引入:

  • CarouselListStyle

随 watchOS 7 引入:

  • EllipticalListStyle

在Xcode11.2.1,正确答案在下面

.listStyle(GroupedListStyle())

Conforming Types  ->
CarouselListStyle
DefaultListStyle
GroupedListStyle
PlainListStyle
SidebarListStyle

参考:https://developer.apple.com/documentation/swiftui/liststyle