将视图传递给SwiftUI中的struct

时间:2020-09-24 23:42:42

标签: swift xcode swiftui

我正在尝试将视图传递到用于创建选项卡的结构中,该代码如下:

struct TabItem: TabView {
    var tabView: View
    var tabText: String
    var tabIcon: String
    
    var body: some View {
        self.tabView.tabItem {
            Text(self.tabText)
            Image(systemName: self.tabIcon)
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            TabView {
                TabItem(tabView: SimpleCalculatorView(), tabText: "Home", tabIcon: "house")
            }
        }
    }
}

我得到的错误如下:

协议“视图”只能用作通用约束,因为它具有“自我”或相关的类型要求

1 个答案:

答案 0 :(得分:1)

这里的错误是因为View协议内部有associatedtype Body,因此您不能使用View作为类型。这意味着我们必须提供有关tabView的预期类型的​​更多信息。解决方案之一是使用AnyView作为类型,但是这需要将其他内容包装到AnyView中。

在这里我建议不要使用AnyView,而是让编译器为您找出实际的tabView类型。

  1. 让我们告诉编译器,我们期望某种类型的Content能够确认View协议
  2. 此外,我并不真正认为将TabView用作TabItem声明的一部分的必要性。除非您有充分的理由不这样做,否则请尝试只使用View
struct TabItem<Content: View>: View {   // Content is a type that we expect. `View` is used instead of `TabView` as it is in original code
    var tabView: Content                // Using Content instead of a View as it is an actual type now
    ...
}

其余代码可以保持不变。