【问题标题】:Change UIPageViewController page programmatically without reloading以编程方式更改 UIPageViewController 页面而无需重新加载
【发布时间】:2015-04-14 23:03:40
【问题描述】:

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

【问题讨论】:

  • “我正在使用 UIPageViewController(持有两个 UIViewController 和一个 UITableViewController)”不可能。 UIPageViewController 一次只有一个视图控制器。
  • “除非他们只存储要显示的数据并每次都加载”。当然。模型视图控制器!不要在视图控制器中存储持久数据。视图控制器告诉视图如何显示模型数据。将数据存储在模型中,并以不依赖视图控制器持久化的方式存储它——因为正如您所发现的,它们不一定持久化。
  • 谢谢马特,原谅我的无知,但我们是在谈论核心数据中的数据模型吗?令我惊讶的是,如果您继续使用 tinder 并向下滚动表格,然后转到另一个视图然后返回,它会以与您离开时相同的偏移量返回。那么他们甚至会存储这样的东西吗?
  • 这是一个导航控制器。它是一个堆栈,所以当你推送和弹出时,你会放松回到同一个视图控制器。这是一个页面视图控制器;它根本不像那样工作。每次页面更改时,您都必须创建一个新的视图控制器。
  • 你误解了我的意思,pageViewController 在包含表格视图控制器的导航控制器之间水平滚动。当您从一页滚动到另一页时,它会记住表格视图的偏移量。这对于正常滚动是有意义的,因为视图控制器被加载到 iPhone 内存中并保存在那里,但是当您执行 setViewControllers 方法时,它通常会创建导航控制器(和子表视图控制器)的新实例并滚动到它,因此重置 tableView 偏移量

标签: ios objective-c uipageviewcontroller


【解决方案1】:

根据您在 cmets 中的详细说明,您注意到页面视图控制器的滚动样式确实会缓存相邻的视图控制器。但这是一个实现细节,你不应该依赖它。在我看来,您不恰当地使用了页面视图控制器,特别是因为您只有三个“页面”。我会建议其中之一:

  • 标签栏控制器。同样,这样做的好处是所有标签栏控制器的子级都保持活动状态。

  • 滚动视图,形成您自己的自定义父视图控制器的基础。您可以将所有三个“页面”作为包含的视图并排放置,然后滚动。这具有更大的优势,即滚动可以正常工作(尽管您也可以使其适用于标签栏控制器)并且您完全负责,因此孩子们再次保持活力。

【讨论】:

  • 感谢马特的坚持!听起来您的第二个建议可能是我所追求的,我非常渴望保持页面视图控制器的滑动导航。
  • 您可以使用标签栏控制器进行滑动导航。但我不确定它比简单的水平分页滚动视图有多大优势。
  • 这对我来说实现起来肯定会更容易,如何方便在标签栏控制器中滚动?
  • 正如我在书中解释的那样,使用这个例子:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 但是滚动视图更容易;我希望你意识到这一点。 :) 使用滚动视图,您只是在执行页面视图控制器正在执行的操作,因为它在滚动样式中 滚动视图 - 除非您始终拥有缓存。
  • 谢谢马特。应与滚动视图一起奋进
【解决方案2】:

感谢 Matt 的 cmets 和回答,我现在知道 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

}`

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2016-01-12
    • 2021-03-12
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2013-02-01
    • 2013-04-25
    相关资源
    最近更新 更多