取出页面视图控制器设置的无限循环

Posted

技术标签:

【中文标题】取出页面视图控制器设置的无限循环【英文标题】:Take out Infinite loop for page view controller setup 【发布时间】:2017-05-07 18:46:09 【问题描述】:

我一直在尝试创建一个具有 3 个视图的开放场景,这些视图嵌入在页面视图控制器中。目标是创建类似 Instagram 的东西,在其中您将社交媒体提要放在中间,然后当您向右滑动时,它会将您带到一个视图,如果您向左滑动,它会将您带到另一个视图。但是,使用我当前的代码,视图控制器会无限滑动,我想知道是否有人知道如何解决这个问题。

这是我当前设置的外观: Current Setup of Page Views

这是我想要的样子: What I want the functionality to be

这是我的页面视图控制器代码。我有一个主页视图控制器链接其他 2 个视图。

class HomeRootPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate 

    lazy var viewControllerArray: [UIViewController] = 
        return [self.ViewControllerInstance(name: "FeedViewController"),
               self.ViewControllerInstance(name: "DMViewController"),
               self.ViewControllerInstance(name: "ProfileViewController")]
    ()

    private func ViewControllerInstance(name: String) -> UIViewController 
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)

    

    override func viewDidLoad() 
        super.viewDidLoad()

        self.dataSource = self
        self.delegate = self

        if let firstViewController = viewControllerArray.first 
            setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
        
    


    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 

        guard let viewControllerIndex = viewControllerArray.index(of: viewController) else 
            return nil
        

        let previousIndex = viewControllerIndex - 1

        guard previousIndex >= 0 else 
            return viewControllerArray.last
        

        guard viewControllerArray.count > previousIndex else 
            return nil
        

        return viewControllerArray[previousIndex]

    

    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 

        guard let viewControllerIndex = viewControllerArray.index(of: viewController) else 
            return nil
        

        let nextIndex = viewControllerIndex + 1

        guard nextIndex < viewControllerArray.count else 
            return viewControllerArray.first
        

        guard viewControllerArray.count > nextIndex else 
            return nil
        

        return viewControllerArray[nextIndex]

    


任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

删除这个:

guard previousIndex >= 0 else 
    return viewControllerArray.last

还有这个:

guard nextIndex < viewControllerArray.count else 
    return viewControllerArray.first

这两个代码块负责循环您的视图控制器。只需删除它们即可获得所需的结果。

【讨论】:

导致此行崩溃:返回 viewControllerArray[previousIndex]。错误说致命错误:索引超出范围。 可能会颠倒 viewControllerArray.last 和 viewControllerArray.first 的位置。因为如果索引低于 0,你想显示第一页而不是最后一页 或者直接返回 nil

以上是关于取出页面视图控制器设置的无限循环的主要内容,如果未能解决你的问题,请参考以下文章

创建一个无限循环的 UIPageViewController

覆盖 initWithCoder 时的无限循环

lvgl|让tabview的页面循环切换(无限切换)

lvgl|让tabview的页面循环切换(无限切换)

iOS 11.2 自定义导航栏无限循环

iOS 11.2自定义导航栏无限循环