ios - 在我的 scrollView 中,Line 在加载时运行了 3 次

标签 ios swift loops scroll

我已经在我的应用中实现了一个 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/

相关文章:

c# - 是否可以根据用户在 sitecore 中上传的图像创建 Sprite ?

ios - 如何从包含同一对象的多个实例的数组中获取不同的对象

ios - Swift - EXC_BAD_ACCESS 尝试将 dict 值读取为 Int 时

ios - 关于 Swift 中闭包的强引用循环

ios - 如何使用 Swift 将 Firebase 3 中的不同数据对象相互关联?

python - opencv while循环,回到第一个循环

sql - 如何在 Oracle 的循环中重复 Select 语句?

ios - native 和非 native iOS 应用程序的区别

iOS 阻止计时器 UILabel 'shaking' 数字更改时

javascript - 如何循环遍历 jQuery 中的数组?