我已经在我的应用中实现了一个 scrollView..
它工作正常,除了当它第一次运行并且我滑动我在下面发布的命令时被调用多次然后 itemIndex 被跳过 1,所以我的其他代码都不起作用。
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)
}
下图显示了 View 首次加载时索引正常工作。
现在我已经向左滑动了一次,索引应该是 1 但它不仅不是 1 它至少还加载了 3 次 View
最佳答案
无法保证 UIPageViewCONtroller 子系统不会为下一个 View 以及之后的 View 提前生成 View Controller 。我的猜测是这就是正在发生的事情。您可能想自己跟踪 View Controller 。您可以保留一组 PageItemController
对象。然后您可以检查传递给 pageViewController(pageViewController:viewControllerAfterViewController:)
的 viewController 的 itemIndex
并生成下一个,或者从数组中返回正确的一个。但您可能不需要或不想这样做。
关于ios - 在我的 scrollView 中,Line 在加载时运行了 3 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31681901/