如何在SwiftUI中创建动态PageViewController?

时间:2020-09-23 17:10:56

标签: swiftui

有人知道如何在iOS 14的SwiftUI中制作动态的PageView控制器吗?显示某些页面的功能,这些页面是其日期的函数,以便人们可以左右滚动查看过去,现在和将来的数据。

struct DatePg: View
{
    let date: Date
    
    var body: some View {
        Text(date.description)
    }
}

有一个新的API,它允许使用TabView和viewModifier来创建PageViewController。但是我所看到的唯一例子是静态的。这是静态PageView的示例。

import SwiftUI

struct SwiftUIPageView: View
{
    @State private var selection = 0
    
    var body: some View {
        TabView(selection: $selection) {
            Text("Hello")
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(Color.blue)
                .tag(0)
            Text("World")
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(Color.red)
                .tag(1)
        }.tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    }
}

使用UIHostingController已经可以正常工作,但是通过UIKit对象传递NSManageObjectContext会引起问题。

这是我到目前为止的位置。仍然无法正常工作。

import SwiftUI

@main struct PagerApp: App
{
    var body: some Scene {
        WindowGroup { DatePageView() }
    }
}

struct DatePageView: View
{
    @StateObject var dateData = DateData(present: Date())
    @State var index: Int = 1

    var body: some View {
        TabView(selection: $index) {
            ForEach(dateData.dates, id: \.self) { date in
                Text(date.description)
                    .onAppear { dateData.current(date: date) }
                    .tag(dateData.tag(date: date))
            }
        }
        .tabViewStyle(PageTabViewStyle())
        .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
    }
}

class DateData: ObservableObject
{
    @Published var dates: [Date]
    
    init(present: Date) {
        let past = present.previousDay()
        let future = present.nextDay()
        self.dates = [past, present, future]
    }
    
    func current(date: Date) {
        //center around
        guard let i = dates.firstIndex(of: date) else { fatalError() }
        self.dates = [ dates[i].previousDay(), dates[i], dates[i].nextDay() ]
        print("make item at \(i) present")
    }
    
    func tag(date: Date) -> Int {
        guard let i = dates.firstIndex(of: date) else { fatalError() }
        return i
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用数组和 sell storage_out storage_in storage 0 0.0 0.0 0.0 0.0 1 3.0 0.0 0.0 0.0 2 1.0 0.0 6.0 6.0 3 1.0 0.0 0.0 6.0 4 8.0 6.0 0.0 0.0 动态创建视图。

这是一个使用字符串数组的示例:

ForEach

您可以在View初始化程序中传递所需的项目

修改:
这是一个在我到达最后一页时添加新页面的示例:

// See edited section

最后一个struct SwiftUIPageView: View { @State private var selection = "0" @State var items: [String] = ["0", "1", "2", "3"] var body: some View { TabView(selection: $selection) { ForEach(items, id: \.self) { item in Text(item) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red) .tag(item) } }.tabViewStyle(PageTabViewStyle()) .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always)) .onChange(of: selection, perform: { value in if Int(value) == (self.items.count - 1) { self.items.append("\(self.items.count)") } }) .id(items) } } 很重要,因为它会在数组更改时强制视图重新加载。