在我的 scrollView 中,Line 在加载时运行了 3 次
Line runs 3 times on load inside my scrollView
我已经在我的应用程序中实现了 scrollView..
它工作正常,除了当它第一次运行并且我滑动我在下面发布的命令时被调用多次然后 itemIndex 被向前跳过 1,所以我的其他代码的 none 工作。
class ViewController: UIViewController, UIPageViewControllerDataSource {
// MARK: - Variables
private var pageViewController: UIPageViewController?
// Initialize it right away here
private let contentImages = quizQuestion
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
createPageViewController()
setupPageControl()
}
private func createPageViewController() {
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController
pageController.dataSource = self
if contentImages.count > 0 {
let firstController = getItemController(0)!
let startingViewControllers: NSArray = [firstController]
pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
pageViewController = pageController
addChildViewController(pageViewController!)
self.view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(self)
}
private func setupPageControl() {
let appearance = UIPageControl.appearance()
appearance.pageIndicatorTintColor = UIColor.grayColor()
appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
appearance.backgroundColor = UIColor.darkGrayColor()
}
// MARK: - UIPageViewControllerDataSource
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
var index = itemController.itemIndex
if index == 0 || index == NSNotFound {
index = self.contentImages.count
}
index--
return getItemController(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
var index = itemController.itemIndex
if index == NSNotFound {
return nil
}
index++
if index == self.contentImages.count {
index = 0
}
return getItemController(index)
}
private func getItemController(itemIndex: Int) -> PageItemController? {
if itemIndex < contentImages.count {
let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as! PageItemController
// as you can see, everything is working fine
// 1 to 2, 2 to 3 etc.
// what you see here is your default PageViewController behaviour. When we scroll from view 1 to view 2, pageViewcontroller will automatically call 2 methods:viewControllerAfterViewController and viewControllerBeforeViewController
// if you want to get current index, let me think, you can get it here.
// are you clear now?
pageItemController.itemIndex = itemIndex
// pageItemController.imageName = contentImages[itemIndex]
//println(contentImages[itemIndex])
//println("item index is \(contentImages[itemIndex])")
return pageItemController
}
return nil
}
}
这是我在首次加载页面时滑动时重复的代码。
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
println("item index is \(itemIndex)") <-
questionLabel.text = quizQuestion[itemIndex].question <-
println(quizQuestion[itemIndex].question) <-
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
}
下图显示首次加载视图时索引正常工作。
现在我已经向左滑动了一次,索引应该是 1 但它不仅不是 1,它至少还加载了视图 3 次
不保证UIPageViewCONtroller 子系统不会为下一个视图以及之后的视图提前生成视图控制器。我的猜测是这就是正在发生的事情。您可能想自己跟踪视图控制器。您可以保留 PageItemController
个对象的数组。然后,您可以检查传递给 pageViewController(pageViewController:viewControllerAfterViewController:)
的 viewController 的 itemIndex
并从数组中生成下一个或 return 正确的。但您可能不需要或不想这样做。
我已经在我的应用程序中实现了 scrollView..
它工作正常,除了当它第一次运行并且我滑动我在下面发布的命令时被调用多次然后 itemIndex 被向前跳过 1,所以我的其他代码的 none 工作。
class ViewController: UIViewController, UIPageViewControllerDataSource {
// MARK: - Variables
private var pageViewController: UIPageViewController?
// Initialize it right away here
private let contentImages = quizQuestion
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
createPageViewController()
setupPageControl()
}
private func createPageViewController() {
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController
pageController.dataSource = self
if contentImages.count > 0 {
let firstController = getItemController(0)!
let startingViewControllers: NSArray = [firstController]
pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
pageViewController = pageController
addChildViewController(pageViewController!)
self.view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(self)
}
private func setupPageControl() {
let appearance = UIPageControl.appearance()
appearance.pageIndicatorTintColor = UIColor.grayColor()
appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
appearance.backgroundColor = UIColor.darkGrayColor()
}
// MARK: - UIPageViewControllerDataSource
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
var index = itemController.itemIndex
if index == 0 || index == NSNotFound {
index = self.contentImages.count
}
index--
return getItemController(index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
var index = itemController.itemIndex
if index == NSNotFound {
return nil
}
index++
if index == self.contentImages.count {
index = 0
}
return getItemController(index)
}
private func getItemController(itemIndex: Int) -> PageItemController? {
if itemIndex < contentImages.count {
let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as! PageItemController
// as you can see, everything is working fine
// 1 to 2, 2 to 3 etc.
// what you see here is your default PageViewController behaviour. When we scroll from view 1 to view 2, pageViewcontroller will automatically call 2 methods:viewControllerAfterViewController and viewControllerBeforeViewController
// if you want to get current index, let me think, you can get it here.
// are you clear now?
pageItemController.itemIndex = itemIndex
// pageItemController.imageName = contentImages[itemIndex]
//println(contentImages[itemIndex])
//println("item index is \(contentImages[itemIndex])")
return pageItemController
}
return nil
}
}
这是我在首次加载页面时滑动时重复的代码。
// MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
println("item index is \(itemIndex)") <-
questionLabel.text = quizQuestion[itemIndex].question <-
println(quizQuestion[itemIndex].question) <-
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
}
下图显示首次加载视图时索引正常工作。
现在我已经向左滑动了一次,索引应该是 1 但它不仅不是 1,它至少还加载了视图 3 次
不保证UIPageViewCONtroller 子系统不会为下一个视图以及之后的视图提前生成视图控制器。我的猜测是这就是正在发生的事情。您可能想自己跟踪视图控制器。您可以保留 PageItemController
个对象的数组。然后,您可以检查传递给 pageViewController(pageViewController:viewControllerAfterViewController:)
的 viewController 的 itemIndex
并从数组中生成下一个或 return 正确的。但您可能不需要或不想这样做。