[英]Inject a view into a view in SwiftUI
我试图将一个视图注入另一个视图以避免代码重复。
我想出了这个主意:
struct WrapperView: View {
var injectedView: some View
var body: some View {
VStack {
injectedView
}
}
}
但我得到一个错误: Property declares an opaque return type, but has no initializer expression from which to infer an underlying type
如何在 SwiftUI 中实现这样的目标?
您可以使用 generics。 这里Content
的类型符合View
,所以我们可以传入Text
之类的东西。
就像是:
struct WrapperView<Content: View>: View {
let injectedView: Content
var body: some View {
VStack {
injectedView
}
}
}
用法:
WrapperView(injectedView: Text("Hello"))
如果你想像这样创建VStack
时调用它:
WrapperView {
Text("Hello")
}
您可以将WrapperView
更改为:
struct WrapperView<Content: View>: View {
private let injectedView: () -> Content
init(@ViewBuilder injectedView: @escaping () -> Content) {
self.injectedView = injectedView
}
var body: some View {
VStack(content: injectedView)
}
}
我们使用@ViewBuilder
,因此我们可以在闭包中构建视图内容,允许我们执行以下操作:
WrapperView {
Text("Hello")
Text("world!")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.