gpt4 book ai didi

swiftui - 如何通过函数为TabView传入内容

转载 作者:行者123 更新时间:2023-12-02 16:01:56 25 4
gpt4 key购买 nike

我正在尝试构建一个可重复使用的入职寻呼机叠加层。所以我想根据变量 IntroType 将不同的“幻灯片”传递到寻呼机 TabView 中。但由于 TabView 无需任何容器即可直接获取内容,那么它的返回类型是什么?

这就是我希望它的工作方式:

struct IntroViewTabPageTest: View {
// MARK: Variables
@Binding var isPresented: Bool
@State var activeSlide: Int = 0
var introType: IntroType

// MARK: UI
var body: some View {
ZStack(alignment: .bottom) {
Color.darkGalaxy

TabView(selection: $activeSlide) {
getContentBasedOnType() // <---- Content here
}
.tabViewStyle(.page)
.indexViewStyle(.page(backgroundDisplayMode: .always))
}
}

// MARK: Functions
private func getContentBasedOnType() -> some View {
switch (introType) {
case .Main:
return introContentMain
case .SA:
return introContentSA
case .Journey:
return introContentJourney
}
}
}

// Static content blocks for each type
extension IntroViewTabPageTest {

// ----> Of course everywhere errors here, "some View" is not the right return type;
// But what is it?

private var introContentMain: some View {
MainIntroSlide1()
TextSlide(headline: "Headline", text: "Text")
}

private var introContentSA: some View {
TextSlide(headline: "Headline", text: "Text")
TextSlide(headline: "Headline2", text: "Text2")
TextSlide(headline: "Headline3", text: "Text3")
}

private var introContentJourney: some View {
TextSlide(headline: "Headline", text: "Text")
}
}

enum IntroType: String {
case Main, SA, Journey
}

struct IntroViewTabPageTest_Previews: PreviewProvider {
static var previews: some View {
IntroViewTabPageTest(isPresented: .constant(true), introType: .Main)
}
}


另一种方法是让扩展中的每个变量都返回一个完整的 TabView,但这非常丑陋,我也没有完全弄明白,该路由仍然会出现其他错误。

我认为一定有一些方法可以做到这一点,我只是还不太了解 SwiftUI 的可用工具。我可以想象一个带有 @ViewBuilder 包装器的函数可以在这里使用,但到目前为止我还没有完全理解它背后的逻辑。

我最接近的是使用一组 AnyView() 幻灯片的向下转换,但这使得使用 ForEach 变得困难并删除类型。

最佳答案

你可以像这样传递内容:

    import SwiftUI

struct IntroViewTabPageTest<Content: View>: View {

let content: Content

init(@ViewBuilder content: () -> Content) {
self.content = content()
}

var body: some View {
ZStack(alignment: .bottom) {
Color.gray

TabView() {
self.content
}
.tabViewStyle(.page)
.indexViewStyle(.page(backgroundDisplayMode: .always))
}
}

}

struct IntroViewTabPageTest_Previews: PreviewProvider {
static var previews: some View {
Group {

IntroViewTabPageTest {
Text("hello 1")
Text("hello 2")
}

IntroViewTabPageTest {
Rectangle()
.fill(Color.green)
.frame(width: 100, height: 100)
}

}
}
}

关于swiftui - 如何通过函数为TabView传入内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70455898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com