如何制作一个闭包以符合“AccessibilityRotorContent”?

问题描述 投票:0回答:1

我创建了一个显示一堆卡片的视图。我向它传递两个参数:

  • 卡片数据数组
  • 为每张卡片构建 CardView 的闭包:
struct CardStack: View {
    var cards: [Card]
    var content: (Int, Card) -> CardView

    init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> CardView) {
        self.cards = cards
        self.content = content
    }
    
    var body: some View {
        ZStack {
            ForEach(Array(cards.enumerated()), id: \.element.id) { index, card in
                content(index, card)
            }
        }
    }
}

当闭包仅包含 CardView 时,它工作得很好,但是一旦我向 CardView 添加任何视图修饰符(并且我需要添加其中的许多视图修饰符),闭包的返回类型就会更改为

some View
,并且我得到错误:
Cannot convert return expression of type 'some View' to return type 'CardView'

var deckBody: some View {
    CardStack(cards: viewModel.cards) { index, card in  // Error: Cannot convert return expression of type 'some View' to return type 'CardView'
        CardView(card: card)
            .zIndex(Double(index))
    }
}

然后,当我修改 CardView 以期望闭包返回

any View
而不是
CardView
时,我收到另一个错误
Static method 'buildExpression' requires that 'Content' conform to 'AccessibilityRotorContent'

struct CardStack: View {
    var cards: [Card]
    var content: (Int, Card) -> any View

    init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> any View) {
        self.cards = cards
        self.content = content
    }
    
    var body: some View {
        ZStack {
            ForEach(Array(cards.enumerated()), id: \.element.id) { index, card in
                content(index, card)     // Error: Static method 'buildExpression' requires that 'Content' conform to 'AccessibilityRotorContent'
            }
        }
    }
}

我为什么要这样做,以及如何使闭包符合“AccessibilityRotorContent”?

ios swift swiftui swiftui-list swift-protocols
1个回答
0
投票

CardStack
应该有一个通用类型参数,指示每张卡片显示的
View
的类型。

struct CardStack<CardContent: View>: View {
    var cards: [Card]
    var content: (Int, Card) -> CardContent

    init(cards: [Card], @ViewBuilder content: @escaping (Int, Card) -> CardContent) {
        self.cards = cards
        self.content = content
    }

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.