简体   繁体   中英

Prevent view controllers from updating when swiping between views with a Page View Controller

One of my views has a lot of data calls on the main page. Currently, when I swipe to another view, it's incredibly slow. The code for the PageViewController is below:

struct PageViewController: UIViewControllerRepresentable {

    var viewControllers: [UIViewController]
    ...
    func makeUIViewController(context: Context) -> UIPageViewController {
        let pageViewController = UIPageViewController(
            transitionStyle: .scroll,
            navigationOrientation: .horizontal)

        pageViewController.dataSource = context.coordinator

        return pageViewController
    }

    func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
        pageViewController.setViewControllers(
            [viewControllers[0]], direction: .forward, animated: true)
    }

    class Coordinator: NSObject, UIPageViewControllerDataSource {

        var parent: PageViewController

        init(_ pageViewController: PageViewController) {
            self.parent = pageViewController
        }

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            guard let index = parent.viewControllers.firstIndex(of: viewController) else {
                 return nil
             }

            if index == 0 {
                return nil
            }

            return parent.viewControllers[index - 1]
        }

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
            guard let index = parent.viewControllers.firstIndex(of: viewController) else {
                return nil
            }
            if index + 1 == parent.viewControllers.count {
                return nil
            }
            return parent.viewControllers[index + 1]
        }
    }

}

Is there any way to not update the views every time the user swipes away and back?

Use the following

func makeUIViewController(context: Context) -> UIPageViewController {
    let pageViewController = UIPageViewController(
        transitionStyle: .scroll,
        navigationOrientation: .horizontal)

    pageViewController.dataSource = context.coordinator
    pageViewController.setViewControllers(          // << move here !!
        [viewControllers[0]], direction: .forward, animated: true)

    return pageViewController
}

func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
   // do something here only if some model/states changed
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM