[英]How to add a generic SwiftUI view to another view?
當嘗試使用泛型類型初始化/添加視圖到另一個 SwiftUI 視圖時,我收到錯誤Type 'T' has no member 'init'
。 如何解決?
我想問題是, View
只是一個協議,它只需要一個body
屬性,僅此而已。 但是可以改用什么類型呢?
簡單示例:
嘗試使用應該創建/顯示T
類型的三個視圖的TrippleView<T: View>
。 添加視圖( RedRectView
或BlueCircleView
)沒問題。 將這些視圖作為通用參數傳遞失敗:
struct SomeView: View {
var body: some View {
TrippleView<RedRectView>()
TrippleView<BlueCircleView>()
}
}
struct TrippleView<T: View>: View {
var body: some View {
VStack {
// Does NOT work: Type 'T' has no member 'init'
T()
T()
T()
// Works fine
// RedRectView()
// BlueCircleView()
// RedRectView()
}
}
}
struct RedRectView: View {...}
struct BlueCircleView: View {...}
編輯:
TrippleView
當然只是一個例子。 我想像使用任何其他泛型類型一樣使用泛型視圖:在不同場景中使用通用的基本“類型”。
例如,兩個版本的列表視圖使用通用CellView
在兩個不同的 styles / 布局中顯示相同的數據。
您需要在結構中使用 ViewBuilder 來初始化視圖。 這是一個例子,
struct TripleView<T: View>: View {
// simple example that takes in one parameter.
var someView: T
init(@ViewBuilder someView: () -> T) {
self.someView = someView()
}
var body: some View {
// You can modify your viewes here.
someView
.foregroundColor(.red)
someView
.foregroundColor(.blue)
someView
.foregroundColor(.green)
}
}
或者你可以接受多個參數
struct TripleViewsWithParam<T1: View, T2: View, T3: View>: View {
// you can take as many parameters as you want.
var someView1: T1
var someView2: T2
var someView3: T3
init(@ViewBuilder someView1: () -> T1, @ViewBuilder someView2: () -> T2, @ViewBuilder someView3: () -> T3) {
self.someView1 = someView1()
self.someView2 = someView2()
self.someView3 = someView3()
}
var body: some View {
VStack {
someView1
someView2
someView3
}
}
}
struct SomeView: View {
var body: some View {
VStack{
TripleView {
Text("Triple View Example")
}
TripleViewsWithParam(
someView1: {
Text("View 1")
}, someView2: {
Text("View 2")
}, someView3: {
Text("View 3")
}
)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.