有人知道如何在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
}
}
答案 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)
}
}
很重要,因为它会在数组更改时强制视图重新加载。