我试图创建一个简单的struct
,它接受一个视图数组,并返回一个包含这些视图的普通VStack
,只是它们都是对角堆叠的。
代码:
struct LeaningTower<Content: View>: View {
var views: [Content]
var body: some View {
VStack {
ForEach(0..<views.count) { index in
self.views[index]
.offset(x: CGFloat(index * 30))
}
}
}
}
现在这个方法很有效,但每当我不得不调用它时,我总是很恼火:
LeaningTower(views: [Text("Something 1"), Text("Something 2"), Text("Something 3")])
在这样一个数组中列出视图对我来说似乎非常奇怪,所以我想知道是否有一种方法可以像这样使用@ViewBuilder
来调用我的LeaningTower
结构体:
LeaningTower { // Same way how you would create a regular VStack
Text("Something 1")
Text("Something 2")
Text("Something 3")
// And then have all of these Text's in my 'views' array
}
如果有一种方法可以使用@ViewBuilder
来创建/提取视图数组,请让我知道。
- (即使不可能使用
@ViewBuilder
,但任何能让它看起来更整洁的东西都会有很大帮助)*
3条答案
按热度按时间pkwftd7m1#
很少需要从数组中提取视图。如果您只是希望将
@ViewBuilder
内容传递到视图中,您可以简单地执行以下操作:如果这对您的用例来说还不够,那么请参见下面的内容。
推荐:我使用我的ViewExtractor包,因为它比这里的代码健壮得多。
我已经有了一个泛型版本,所以不需要为不同长度的元组创建多个初始化器。另外,视图可以是任何你想要的(你不需要限制每个
View
都是相同的类型)。你可以在GeorgeElsham/ViewExtractor上找到我为此制作的Swift包。它包含的内容比这个答案中的内容要多,因为这个答案只是一个简化的基本版本。由于代码与这个答案略有不同,所以先阅读
README.md
作为示例。回到答案,示例用法:
视图的定义:
TupleView
扩展(也就是所有神奇的事情发生的地方):结果:
zdwk9cvp2#
任何能让它看起来更整洁的东西都会有很大帮助
好吧,这会让你更接近:
将此
init
添加到您的LeaningTower
:然后像这样使用它:
您可以将偏移作为可选参数添加:
示例用法:
gv8xihay3#
我自己在试图找出类似的问题时偶然发现了这一点。所以为了后代和其他人的利益,他们对类似的问题绞尽脑汁。
我发现获取子偏移量的最好方法是使用Swift的类型化机制,如下所示。
用法是
它还可以用于任何视图,而不仅仅是文本,例如
缺点是每个额外的视图都需要一个自定义初始化器,但听起来像是same approach that Apple is using for their stacks
我怀疑基于Mirror的一些东西和说服Swift动态调用可变数量的不同名称的方法可能会起作用。但这很可怕,大约一周前我用完了时间;如果有人有更优雅的东西,我会很感兴趣的。