SwiftUI - PageView - 传递不同的视图
SwiftUI - PageView - Pass in different Views
我通过线程在 SwiftUI 中成功实现了 PageView:
只要所有视图都具有相同的结构,通过数组传递多个视图就很有魅力。
PageView([TestView(), TestView()])
.
不过,我想传递不同的看法。
PageView([TestView(), AnotherView(), DifferentView()])
。
所有视图均为 SwiftUI 类型:
struct NAME : View { code }
当我尝试向数组添加不同的结构时,我收到以下错误消息:
var pageViewViewArray = [TestView(), AnotherView(), DifferentView()]
Heterogeneous collection literal could only be inferred to '[Any]';
add explicit type annotation if this is intentional.
Insert' as [Any]
将其转换为:
var pageViewViewArray = [TestView(), AnotherView(), DifferentView()] as! [Any]
PageView(pageViewViewArray)
PageView 会说:
Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols
如果有任何想法,我将不胜感激。
通过将每个视图强制转换为 AnyView
:
来尝试使用类型擦除
var pageViewViewArray: [AnyView] = [AnyView(TestView()), AnyView(AnotherView()), AnyView(DifferentView())]
有一种更有效的方法,无需类型擦除。您应该创建一个公共视图,在其中注入一个枚举值,然后根据该值 return 一个所需的视图。请看下面的示例:
/// The first type of a view that accepts and shows a number
struct ViewA: View {
let number: Int
var body: some View {
Text("\(number)")
}
}
/// The second type of a view that accepts and shows a string
struct ViewB: View {
let string: String
var body: some View {
Text(string)
}
}
/// An enum type used for dependency injection
enum ViewType {
case viewA(number: Int)
case viewB(string: String)
}
/// A common view which internally handles different kind of views based on injected enum value
struct CommonView: View {
let viewType: ViewType
var body: some View {
switch viewType {
case .viewA(let number):
ViewA(number: number)
case .viewB(let string):
ViewB(string: string)
}
}
}
// Views used for page view controller, that are now of same type:
var pageViewViewArray = [
CommonView(viewType: .viewA(number: 1)),
CommonView(viewType: .viewB(string: "Hello, World!"))
]
我通过线程在 SwiftUI 中成功实现了 PageView:
只要所有视图都具有相同的结构,通过数组传递多个视图就很有魅力。
PageView([TestView(), TestView()])
.
不过,我想传递不同的看法。
PageView([TestView(), AnotherView(), DifferentView()])
。
所有视图均为 SwiftUI 类型:
struct NAME : View { code }
当我尝试向数组添加不同的结构时,我收到以下错误消息:
var pageViewViewArray = [TestView(), AnotherView(), DifferentView()]
Heterogeneous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional.
Insert' as [Any]
将其转换为:
var pageViewViewArray = [TestView(), AnotherView(), DifferentView()] as! [Any]
PageView(pageViewViewArray)
PageView 会说:
Protocol type 'Any' cannot conform to 'View' because only concrete types can conform to protocols
如果有任何想法,我将不胜感激。
通过将每个视图强制转换为 AnyView
:
var pageViewViewArray: [AnyView] = [AnyView(TestView()), AnyView(AnotherView()), AnyView(DifferentView())]
有一种更有效的方法,无需类型擦除。您应该创建一个公共视图,在其中注入一个枚举值,然后根据该值 return 一个所需的视图。请看下面的示例:
/// The first type of a view that accepts and shows a number
struct ViewA: View {
let number: Int
var body: some View {
Text("\(number)")
}
}
/// The second type of a view that accepts and shows a string
struct ViewB: View {
let string: String
var body: some View {
Text(string)
}
}
/// An enum type used for dependency injection
enum ViewType {
case viewA(number: Int)
case viewB(string: String)
}
/// A common view which internally handles different kind of views based on injected enum value
struct CommonView: View {
let viewType: ViewType
var body: some View {
switch viewType {
case .viewA(let number):
ViewA(number: number)
case .viewB(let string):
ViewB(string: string)
}
}
}
// Views used for page view controller, that are now of same type:
var pageViewViewArray = [
CommonView(viewType: .viewA(number: 1)),
CommonView(viewType: .viewB(string: "Hello, World!"))
]