代码
我有以下代码:
struct CustomTabView: View where Content: View {
let children: [AnyView]
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
let m = Mirror(reflecting: content())
if let value = m.descendant("value") {
let tupleMirror = Mirror(reflecting: value)
let tupleElements = tupleMirror.children.map({ AnyView($0.value) }) // ERROR
self.children = tupleElements
} else {
self.children = [AnyView]()
}
}
var body: some View {
ForEach(self.children) { child in
child...
}
}
}
问题
我尝试将TupleView
转换为AnyView
数组,但收到错误
Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols
可能的解决方案
我可以解决这个问题的一种方法是将类型擦除的视图传入CustomTabView
,如下所示:
CustomTabView {
AnyView(Text("A"))
AnyView(Text("B"))
AnyView(Rectangle())
}
理想情况下
但我希望能够像原生TabView
一样执行以下操作
CustomTabView {
Text("A")
Text("B")
Rectangle()
}
那么我该如何将TupleView
转换为AnyView
数组呢?
3条答案
按热度按时间23c0lvtd1#
以下是我如何使用SwiftUI创建自定义选项卡视图:
以下是首选项和视图扩展:
用法如下:
我希望这对你们有用,如果你知道更好的方法,请告诉我!
abithluo2#
我为此创建了
IterableViewBuilder
mrphzbgm3#
实际上,有一种本地方法可以通过
_VariadicView.MultiViewRoot
或_VariadicView.UnaryViewRoot
协议来实现这一点。您需要实现其中一个协议。然后,在
body(children: _VariadicView.Children) -> some View
方法中,可以迭代所有子视图(_VariadicView.Children
是Collection
)。您的实现和子级应该使用_VariadicView.Tree
视图 Package 。两者之间的选择取决于您的需求:如果你想要一个像视图数组一样的视图,并且可以放在
VStack
或HStack
等中,你可以使用_VariadicView.MultiViewRoot
。另一方面,如果您需要一个独立的视图,_VariadicView.UnaryViewRoot
将是一个不错的选择。下面是一个例子:
此代码创建一个使用
_VariadicView.MultiViewRoot
协议的WithSeparator
结构体。这允许您在视图之间添加分隔符。