以编程方式更改 UIPageViewController 页面而无需重新加载

Change UIPageViewController page programmatically without reloading

我正在使用 UIPageViewController(包含两个 UIViewController 和一个 UITableViewController)在我的应用程序中导航。我添加了按钮以从一个页面移动到另一个页面,使用许多堆栈溢出问题中建议的 setViewControllers 方法。但是,如果我从视图控制器 B 开始,滑动到视图控制器 A,然后使用建议的 setViewControllers 方法 return 来查看控制器 B,它不会简单地 return 到页面,它会加载一个视图控制器 B 的新实例。这是一个问题,因为我在视图控制器 B 中显示从 Internet 检索到的数据,因此每次都检索它是非常无效的。 现在我知道这是可能的,因为 snapchat、tinder 和 fling 都可以做到。除非他们只是存储要显示的数据并每次都加载

根据您在评论中的阐述,您已经注意到页面视图控制器的滚动样式确实恰好缓存了相邻的视图控制器。但那是一个实现细节,你不应该依赖它。在我看来,您似乎不恰当地使用了页面视图控制器,尤其是因为您只有三个 "pages"。我建议其中之一:

  • 标签栏控制器。同样,这有一个优点,即所有标签栏控制器的 children 保持活动状态。

  • 滚动视图,形成您自己的自定义 parent 视图控制器的基础。您可以将所有三个 "pages" 作为包含的视图并排放置,然后滚动。这有一个更大的优势,滚动可以正常工作(尽管你也可以让它为标签栏控制器工作)并且你完全负责所以再次 children 全部保持活跃。

感谢 Matt 的评论和回答,我现在知道 UIPageViewController 不会将子视图控制器持久保存在内存中,所以我改用了 UIScrollView。无论如何,它实际上比 UIPageViewController 更容易实现。下面的代码设置了我需要的

 override func viewDidLoad() {
        super.viewDidLoad()

    var scrollView = UIScrollView(frame: CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height))
    scrollView.contentSize = CGSizeMake(self.view.bounds.width*3, self.view.bounds.height)
    scrollView.pagingEnabled=true
    self.view.addSubview(scrollView)

    var scrollView2 = UIScrollView(frame: CGRectMake(self.view.bounds.width, 0, self.view.bounds.width, self.view.bounds.height))
    scrollView2.backgroundColor=UIColor.redColor()
    scrollView2.contentSize=CGSizeMake(self.view.bounds.width, 2*self.view.bounds.height)
    scrollView2.pagingEnabled=true
    scrollView2.bounces=false
    scrollView2.showsHorizontalScrollIndicator=false
    scrollView2.showsVerticalScrollIndicator=false
    scrollView.addSubview(scrollView2)

    var view1 = UIView(frame: CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height))
    view1.backgroundColor=UIColor.blueColor()
    scrollView.addSubview(view1)
    //Add View controller 1 to view1

    var view2 = UIView(frame: CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height))
    view2.backgroundColor=UIColor.greenColor()
    scrollView2.addSubview(view2)
    //Add view controller 2 to view2

    var view3 = UIView(frame: CGRectMake(0, self.view.bounds.height, self.view.bounds.width, self.view.bounds.height))
    view3.backgroundColor=UIColor.yellowColor()
    scrollView2.addSubview(view3)
    //Add view controller 3 to view3

    var view4 = UIView(frame: CGRectMake(2*view.bounds.width, 0, self.view.bounds.width, self.view.bounds.height))
    view4.backgroundColor=UIColor.orangeColor()
    scrollView.addSubview(view4)
    //Add view controller 4 to view4

}`