В моем приложении SwiftUI возникают ошибки при попытке передать некоторые представления в моем PageViewController. И я не понимаю, что они хотят значить. Я настроил PageViewController следующим образом: classi c way:
Файл PageViewController:
import Foundation
import UIKit
import SwiftUI
struct PageViewController: UIViewControllerRepresentable {
@Binding var currentPageIndex: Int
@EnvironmentObject var viewData: ViewData
var viewControllers: [UIViewController]
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIViewController(context: Context) -> UIPageViewController {
let pageViewController = UIPageViewController(
transitionStyle: .scroll,
navigationOrientation: .horizontal,
options: [UIPageViewController.OptionsKey.interPageSpacing : self.viewData.pageViewControllerPadding]
)
pageViewController.dataSource = context.coordinator
pageViewController.delegate = context.coordinator
let compassScreen = viewControllers[0]
let sonarScreen = viewControllers[1]
compassScreen.view.backgroundColor = UIColor.clear
sonarScreen.view.backgroundColor = UIColor.clear
return pageViewController
}
func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
pageViewController.setViewControllers(
[viewControllers[currentPageIndex]], direction: currentPageIndex == 0 ? .reverse : .forward, animated: true
)
}
class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var parent: PageViewController
init(_ pageViewController: PageViewController) {
self.parent = pageViewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
// Retrieves the index of the currently displayed view controller
guard let index = parent.viewControllers.firstIndex(of: viewController) else {
return nil
}
// Shows the last view controller when the user swipes back from the first view controller
if index == 0 {
return nil
}
// Show the view controller before the currently displayed view controller
return parent.viewControllers[index - 1]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
// Retrieves the index of the currently displayed view controller
guard let index = parent.viewControllers.firstIndex(of: viewController) else {
return nil
}
// Shows the first view controller when the user swipes further from the last view controller
if index + 1 == parent.viewControllers.count {
return nil
}
// Show the view controller after the currently displayed view controller
return parent.viewControllers[index + 1]
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if completed, let visibleViewController = pageViewController.viewControllers?.first, let index = parent.viewControllers.firstIndex(of: visibleViewController) {
parent.currentPageIndex = index
}
}
}
}
Файл PageView:
import SwiftUI
struct PageView<Page: View>: View {
@State var currentPage = 0
var viewControllers: [UIHostingController<Page>]
init(_ views: [Page]) {
self.viewControllers = views.map{ UIHostingController(rootView: $0) }
}
var body: some View {
VStack(alignment: .center) {
PageViewController(
currentPageIndex: $currentPage,
viewControllers: viewControllers
)
}
}
}
И мой contentView файл, в котором я пытаюсь передать свои представления следующим образом:
import SwiftUI
import CoreLocation
@EnvironmentObject var settingsStore: SettingsStore
@EnvironmentObject var userData: UserData
struct ContentView: View {
var body: some View {
VStack() {
PageView([
Compass()
.padding(.bottom, 10)
.environmentObject(settingsStore)
.environmentObject(userData)
Sonar()
.padding(.bottom, 10)
.environmentObject(settingsStore)
.environmentObject(userData)
])
}
}
}
У меня есть эта ошибка для PageView(...)
строк:
Я пытался поставить это:
PageView([
UIHostingController(rootView: Compass()
.padding(.bottom, 10)
.environmentObject(settingsStore)
.environmentObject(userData)
),
UIHostingController(rootView: Sonar()
.padding(.bottom, 10)
.environmentObject(settingsStore)
.environmentObject(userData)
)
])
Но у меня снова ошибка:
Я не знаю что я могу сделать?