Как передать некоторые представления в PageViewController в SwiftUI? - PullRequest
0 голосов
/ 04 мая 2020

В моем приложении 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(...) строк:

Screenshot error

Я пытался поставить это:

 PageView([
   UIHostingController(rootView: Compass()
     .padding(.bottom, 10)
     .environmentObject(settingsStore)
     .environmentObject(userData)
   ),
   UIHostingController(rootView: Sonar()
     .padding(.bottom, 10)
     .environmentObject(settingsStore)
     .environmentObject(userData)
   )
 ])

Но у меня снова ошибка:

Screenshot error 2

Я не знаю что я могу сделать?

...