如何从WITHIN中的一个UIVageControllers更改UIPageViewController是一个UIPageViewController的一部分?

时间:2016-11-04 16:17:08

标签: ios swift uipageviewcontroller

我一直试图解决这个问题几个小时,我必须误解UIPageViewController的工作原理。

我有5个设置屏幕(加载到UIPageViewController中的单独视图控制器),我可以向右或向左滑动以查看。

BUT!我希望能够以编程方式显示下一个视图控制器在他们关闭其中一个视图控制器上的警报后排队。

到目前为止,我发现的唯一解决方案是,这个解决方案(https://github.com/jeffaburt/UIPageViewController-Post)允许“下一个”按钮,但按钮不在视图上显示的控制器,它位于保存UIPageViewController的根视图控制器上。

我设置UIPageViewController以显示5个不同的视图控制器,使用此代码。

private(set) lazy var orderedViewControllers: [UIViewController] = {
    return [self.newColoredViewController("setup1"),
            self.newColoredViewController("setup2"),
            self.newColoredViewController("setup3"),
            self.newColoredViewController("setup4"),
            self.newColoredViewController("setup5")]
}()

然后newColoredViewController函数执行此操作:

private func newColoredViewController(color: String) -> UIViewController {
    return UIStoryboard(name: "Main", bundle: nil) .
        instantiateViewControllerWithIdentifier("\(color)")
}

这是我的viewDidLoad

 override func viewDidLoad() {
    super.viewDidLoad()

    dataSource = self



    if let SetupViewController = orderedViewControllers.first {
        setViewControllers([SetupViewController],
                           direction: .Forward,
                           animated: true,
                           completion: nil)
    }


}

我必须缺少一些基本的理解,因为我尝试了很多不同的方法来以编程方式更改页面,但没有任何反应。

我尝试过这样做,但它没有做任何事情:

setViewControllers([orderedViewControllers[3]],
                           direction: .Forward,
                           animated: true,
                           completion: nil)

我尝试过这样做,但它没有做任何事情:

func scrollToNextViewController() {
    if let visibleViewController = viewControllers?.first,
        let nextViewController = pageViewController(self,
                                                    viewControllerAfterViewController: visibleViewController) {
        scrollToViewController(nextViewController)
    }
}

请指出我正确的方向!!我可以整天研究,通常可以解决这个问题,这要归功于之前已经回答的stackoverflow问题,但在这里我很难过。

提前致谢!!

3 个答案:

答案 0 :(得分:2)

在我已经设置的结构中,我想出了一种更简单的方法。在UIPageViewController中,添加了这个函数:

func nextPageWithIndex(index: Int)
{
   // let nextWalkthroughVC = newColoredViewController("setup4")
    let nextWalkthroughVC = orderedViewControllers[index]
        setViewControllers([nextWalkthroughVC], direction: .Forward, animated: true, completion: nil)

}

然后在其中一个设置视图控制器中,我创建了一个运行此代码的按钮操作:

@IBAction func yeaaa(sender: AnyObject) {
              let parent = self.parentViewController as! SetupViewController

    parent.nextPageWithIndex(3)
}

(其中" SetupViewController"是UIPageViewController)

是的,这让我疯了。

这里的视频给了我" self.parentViewController的想法! SetupViewController"和" nextPageWithIndex"代码:https://www.youtube.com/watch?v=K3CSBxX5VXA

答案 1 :(得分:0)

我想在newColoredViewController中创建了pageViewController要显示的视图控制器的实例。

在那里你应该传递给显示视图控制器的引用。就像是 newSetupViewConroller.setNextDelegate(self)

定义具有方法NextDelegate

的协议performNext

那应该是setNextDelegate的参数类型(和相关实例变量)。 (除了setter方法,您当然可以声明类型NextDelegate

的某些属性

您的展示视图控制器应符合此协议并实施performNext方法。

当您这样做时,您可以访问呈现视图控制器(作为符合协议的对象),您可以调用其方法performNext

performNext方法中,您处于展示视图控制器中并可以访问pageViewController并从那里开始。

(有更简单的方法可以做到这一点,但我认为这是一个合适的方法。这就是制定协议的方法。)

答案 2 :(得分:0)

首先,我们需要以PageViewController身份访问父类

迅速5:

   if let controller = self.parent as? yourPageViewController             
          controller.goToNextPage()
   }

PageViewController Extension可以这样使用

extension UIPageViewController {

    func goToNextPage(animated: Bool = true) {
        guard let currentViewController = self.viewControllers?.first else { return }
        guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return }
        setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil)
    }

    func goToPreviousPage(animated: Bool = true) {
        guard let currentViewController = self.viewControllers?.first else { return }
        guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return }
        setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil)
    }
}