繁体   English   中英

将视图注入到SwiftUI中的视图中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM