簡體   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