Ios 如何禁用ViewController的有限循环?

Ios 如何禁用ViewController的有限循环?,ios,swift,uipageviewcontroller,Ios,Swift,Uipageviewcontroller,我在网上找到了这段代码并进行了测试。它起作用了,但它是无限循环的。我看到一些关于为页面索引创建一个新的func的帖子 链接到我在其上找到代码的网站: 有人愿意编辑代码以结束循环吗 import UIKit class MyPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { var pages = [UIViewControlle

我在网上找到了这段代码并进行了测试。它起作用了,但它是无限循环的。我看到一些关于为页面索引创建一个新的
func
的帖子

链接到我在其上找到代码的网站:

有人愿意编辑代码以结束循环吗

import UIKit

class MyPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    var pages = [UIViewController]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.delegate = self
        self.dataSource = self

        let page1: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page1")
        let page2: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page2")
        let page3: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page3")

        pages.append(page1)
        pages.append(page2)
        pages.append(page3)

        setViewControllers([page2], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.indexOf(viewController)!
        let previousIndex = abs((currentIndex - 1) % pages.count)

        return pages[previousIndex]
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.indexOf(viewController)!
        let nextIndex = abs((currentIndex + 1) % pages.count)
        return pages[nextIndex]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

页面视图控制器不应换行

您的
viewControllerBeforeViewController
viewControllerAfterViewController
方法都被编写为从第一个到最后一个或从最后到第一个,这是错误的

只需将
viewControllerBeforeViewController
重写为减量
currentIndex
,并返回该视图控制器,除非它是 类MyPageViewController:UIPageViewController、UIPageViewControllerDataSource、UIPageViewControllerDelegate{

var pages = [UIViewController]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self
    self.dataSource = self

    let page1: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page1")
    let page2: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page2")
    let page3: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page3")


    pages.append(page1)
    pages.append(page2)
    pages.append(page3)


    setViewControllers([page2], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {


    let currentIndex = pages.indexOf(viewController)!


    let previousIndex = abs((currentIndex - 1) % pages.count)


    if (previousIndex > 0)
    {
        return nil
    }



    return pages[previousIndex]
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.indexOf(viewController)!
    let nextIndex = abs((currentIndex + 1) % pages.count)


    if (nextIndex < 1)
    {
        return nil
    }

    return pages[nextIndex]

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
<代码>var页面=[UIViewController]() 重写func viewDidLoad(){ super.viewDidLoad() self.delegate=self self.dataSource=self 让page1:UIViewController!=情节提要?。实例化EVIEWControllerWithiIdentifier(“page1”) 让page2:UIViewController!=情节提要?。实例化EVIEWControllerWithiIdentifier(“page2”) 让page3:UIViewController!=情节提要?。实例化EVIEWControllerWithiIdentifier(“page3”) pages.append(第1页) pages.append(第2页) 第页。追加(第3页) SetViewController([page2],方向:UIPageViewControllerNavigationDirection.Forward,动画:false,完成:nil) } func pageViewController(pageViewController:UIPageViewController,viewController预览控制器viewController:UIViewController)->UIViewController{ 让currentIndex=pages.indexOf(viewController)! 让previousIndex=abs((currentIndex-1)%pages.count) 如果(以前的索引>0) { 归零 } 返回页面[以前的索引] } func pageViewController(pageViewController:UIPageViewController,viewControllerAfterViewController:UIViewController)->UIViewController{ 让currentIndex=pages.indexOf(viewController)! 设nextIndex=abs((currentIndex+1)%pages.count) 如果(nextIndex<1) { 归零 } 返回页面[nextIndex] } 重写函数didReceiveMemoryWarning(){ 超级。我收到了记忆警告() //处置所有可以重新创建的资源。 } }

Swift 3.0
“它工作了,但它在一个无限循环中”——这是一个矛盾。@rmaddy,看看代码,我认为他不是指无限循环。该代码使最后一页循环回到第一页,并使第一页循环到最后一页。不完全是一个无限循环,而是一本无穷无尽的书。(参见我的答案)我无法使
viewControllerAfterViewController
工作,我可以一直向右滚动<代码>viewControllerBeforeViewController工作正常,谢谢。也许给我一点代码,这样我就可以完成
viewControllerAfterViewController
。在
viewControllerAfterViewController
中,它应该是
nextIndex<1
,然后它就可以工作了:)谢谢,听起来不对。您需要确保新索引没有超出数组边界,因此在
viewControllerAfterViewController
中,您需要测试
nextIndex
它仍然可以使用
nextIndex<1
nextIndex
由于某种原因不起作用,它将它放在一个循环中。因此,在问题的底部发布您的修订代码作为解决方案。谢谢,使用代码示例使其非常容易理解
var pages = [UIViewController]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.delegate = self
    self.dataSource = self

    let page1: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page1")
    let page2: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page2")
    let page3: UIViewController! = storyboard?.instantiateViewControllerWithIdentifier("page3")


    pages.append(page1)
    pages.append(page2)
    pages.append(page3)


    setViewControllers([page2], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {


    let currentIndex = pages.indexOf(viewController)!


    let previousIndex = abs((currentIndex - 1) % pages.count)


    if (previousIndex > 0)
    {
        return nil
    }



    return pages[previousIndex]
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    let currentIndex = pages.indexOf(viewController)!
    let nextIndex = abs((currentIndex + 1) % pages.count)


    if (nextIndex < 1)
    {
        return nil
    }

    return pages[nextIndex]

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
var pages = [UIViewController]()

extension ViewController: UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.index(of: viewController)!
        let previousIndex = currentIndex - 1
        return (previousIndex == -1) ? nil : pages[previousIndex]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController,
                            viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let currentIndex = pages.index(of: viewController)!
        let nextIndex = currentIndex + 1
        return (nextIndex == pages.count) ? nil : pages[nextIndex]
    }
}