更新 ViewController 不更新 PageViewController 点
Posted
技术标签:
【中文标题】更新 ViewController 不更新 PageViewController 点【英文标题】:Updating ViewController not updating PageViewController dots 【发布时间】:2018-03-30 10:15:51 【问题描述】:我正在尝试展示一个带有 3 个 ContentViewController 的 PageViewController,用户可以在其中从一个页面移动到下一个页面,但也可以使用计时器自动滚动到下一页。
第一个问题:如何让页面视图控制器正确更新页面底部的点。
我已经实现了三页 PageViewController 并有一个基于计时器的自动化。计时器调用:
@objc func animation()
if counter < 2 counter += 1
else counter = 0
self.pageViewController.setViewControllers([self.pageTutorialAtIndex(counter)], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
对 setViewControllers 的调用会更改视图。 但是,它不会更新页面底部的 PageViewController 点。需要做些什么来解决这个问题?
显然这个类级别的计数器没有得到当前显示的 ViewContoller,这导致我的第二个问题。
第二个问题:如何正确实现从显示的页面获取当前索引?我试过了:
let current = self.pageTutorialAtIndex(0) as SplashContentViewController
var counter : Int = current.pageIndex!
认为这会读取当前页面,但似乎只读取第 0 页。
类和viewDidLoad是:
class SplashViewController: UIViewController, UIPageViewControllerDataSource
var pageImages:NSArray!
var pageTitles:[String]!
var pageTexts:[String]!
var pageViewController:UIPageViewController!
var waitTimer : Timer!
var counter : Int = 0
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
pageImages = NSArray(objects:"sp_image1","sp_image2","sp_image3")
pageTitles = [NSLocalizedString("sp_title1",comment: ""), NSLocalizedString("sp_title2", comment: ""), NSLocalizedString("sp_title3", comment: "")]
pageTexts = [NSLocalizedString("sp_detail1",comment: ""), NSLocalizedString("sp_detail2", comment: ""), NSLocalizedString("sp_detail3", comment: "")]
self.pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "SplashPageViewController") as! UIPageViewController
self.pageViewController.dataSource = self
let initialContenViewController = self.pageTutorialAtIndex(0) as SplashContentViewController
self.pageViewController.setViewControllers([initialContenViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMove(toParentViewController: self)
使用实现委托方法:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
let viewController = viewController as! SplashContentViewController
var index = viewController.pageIndex as Int
if(index == 0 || index == NSNotFound)return nil
index -= 1
return self.pageTutorialAtIndex(index)
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
let viewController = viewController as! SplashContentViewController
var index = viewController.pageIndex as Int
if((index == NSNotFound))return nil
index += 1
if(index == pageImages.count)return nil
return self.pageTutorialAtIndex(index)
func presentationCount(for pageViewController: UIPageViewController) -> Int
return pageImages.count
func presentationIndex(for pageViewController: UIPageViewController) -> Int
return 0
【问题讨论】:
【参考方案1】:我似乎找到了一个可能的答案:
第一个问题:如何让页面视图控制器正确更新页面底部的点。返回当前计数器提供了权利,而不是返回 0。
func presentationIndex(for pageViewController: UIPageViewController) -> Int
return counter
第二个问题:如何实现获取当前索引?在我的解决方案中,计数器变量标识当前页面。它无法从显示的页面正确获取索引,但可以正常工作。
使用全局计数器变量的实现是:
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
let viewController = viewController as! SplashContentViewController
let index = viewController.pageIndex as Int
if(index == NSNotFound)
return nil
if(index > 0)
counter = index - 1
return self.pageTutorialAtIndex(counter)
else
counter = 0
return nil
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
let viewController = viewController as! SplashContentViewController
let index = viewController.pageIndex as Int
if((index == NSNotFound))
return nil
if (index < pageImages.count - 1)
counter = index + 1
return self.pageTutorialAtIndex(counter)
else
counter = pageImages.count - 1
return nil
【讨论】:
也觉得这很有帮助***.com/questions/8400870/…【参考方案2】:您好,您已经将当前页面的索引设置在:
viewControllerBefore 和 viewControllerAfter
只需在每个函数中返回视图控制器之前创建一个全局变量并存储索引值,类似于
self.currentIndex = index
然后返回有问题的视图控制器
return self.pageTutorialAtIndex(index)
【讨论】:
感谢您的回答,但这与我正在使用的全局“计数器”变量相同。我知道可以在不以这种方式跟踪的情况下获取当前页面。以上是关于更新 ViewController 不更新 PageViewController 点的主要内容,如果未能解决你的问题,请参考以下文章
快速滚动 UIPageViewController 阻止 viewcontroller 更新
NSManagedObject 传递给 ViewController 是不是反映所有更新
从一个 ViewController 中获取一个随机数并在第二个 ViewController 中使用它 - 更新
如何从另一个 ViewController 更新 LineChart