如何指定将保存 SwiftUI 自定义视图的数组的类型信息
Posted
技术标签:
【中文标题】如何指定将保存 SwiftUI 自定义视图的数组的类型信息【英文标题】:How to specify the type information of an array that would hold SwiftUI custom views 【发布时间】:2020-07-17 08:08:01 【问题描述】:我正在学习 SwiftUI,我明白要使用 SwiftUI 框架创建视图元素,您的自定义类型必须符合“视图”协议。我有一个要求,我想声明一个数组,该数组将包含我将通过创建一个实现“视图”协议的结构来创建的自定义 SwiftUI 组件。现在我不确定要提到什么作为数组的类型,因为提供“视图”作为类型会给编译器错误,因为“Protocol 'View' 只能用作通用约束,因为它具有 Self 或相关的类型要求”。
struct ContentView: View
var tabs : [View]
var body: some View
Text("Hello World")
【问题讨论】:
这不是 SwiftUI 的方向...尝试使用模型(或视图模型)对象数组代替,并根据它们在正文中创建相应的视图。 看看苹果的教程:developer.apple.com/tutorials/swiftui 你为什么要在另一个视图上存储一组视图?你想达到什么目的? 【参考方案1】:这里演示了根据某些模型枚举生成不同视图的可能方法。使用 Xcode 11.4 / ios 13.4 测试
enum CustomTabDescriptior: Int
case one = 1
case two = 2
case three = 3
var label: String
"\(self.rawValue).square"
// can be used also a function with arguments to be passed inside
// created corresponding views
var view: some View
Group
if self == .one
Text("One") // << any custom view here or below
if self == .two
Image(systemName: "2.square")
if self == .three
Button("Three")
print(">> activated !!")
struct DemoDynamicTabView: View
let tabs: [CustomTabDescriptior] = [.one, .two, .three]
var body: some View
TabView
ForEach(tabs, id: \.self) tab in
tab.view
.tabItem
Image(systemName: tab.label)
【讨论】:
非常感谢您的回答。我正在尝试构建一个自定义 TabView,我可以在其中传递一些参数并动态构建选项卡栏。我用我使用 UITabBarController 构建类似东西的经验来解决这个问题。这就是使用数组保存视图组件的原因。您的代码在 SwiftUI 中为我提供了正确的方法。谢谢你!!。并且编译器错误与使用“具有关联类型的协议”作为变量的类型有关,这不是 SwiftUI 特有的。以上是关于如何指定将保存 SwiftUI 自定义视图的数组的类型信息的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI - 如何在文本视图中更改自定义 SF 符号的颜色?