UIPageViewController 实现 - 更改视图控制器后黑屏

UIPageViewController Implementation - Black Screen After Changing View Controllers

尝试成功实现允许用户使用 UIPageViewController 在 UIViewControllers 之间滚动的应用。

目前,滑动到第二个UIViewController后,屏幕变黑,无法再滚动。有什么想法吗?

这是我的子类 UIPageViewController 代码:

class ApplicationViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var registrationController : UIViewController!
var loginController : UIViewController!
var captureController : UIViewController!
var visibleVCS = [UIViewController]()
var index = 0

override func viewDidLoad() {
    super.viewDidLoad()
    initControllers()
    reset()
}

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

func initControllers()
{
    registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as UIViewController
    loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as UIViewController
    captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as UIViewController

    visibleVCS = [registrationController, loginController, captureController]
}

func reset() {
    var currentController = viewControllerAtIndex(index)
    pageViewController.dataSource = self
self.setViewControllers([currentController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    if(index >= visibleVCS.count - 1){
        return nil
    }
    return self.viewControllerAtIndex(++index)
}

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

    if(index <= 0){
        return nil
    }
    return self.viewControllerAtIndex(--index)

}

func viewControllerAtIndex(index : Int) -> UIViewController? {
    return visibleVCS[index];
}
}

在 UIPageViewController 中将索引保存为 属性 对我也不起作用。为了解决这个问题,我必须创建一个索引为 属性 的基础 UIViewController,如下所示:

class PageItemController: UIViewController {

var index = -1

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

然后让你的所有页面成为 PageItemController 的子类,并根据它们在数组中的位置设置它们的索引

func initControllers(){
    registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as PageItemController
    registrationController.index = 0
    loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as PageItemController
    loginController.index = 1
    captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as PageItemController
    captureController.index = 2
    // visibleVCS type must be [PageItemCotroller]
    visibleVCS = [registrationController, loginController, captureController]
}

最后根据currentController索引实现before和after方法

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

    let itemController = viewController as! PageItemController

    if itemController.index > 0 {

        return visibleVCS[itemController.index - 1]

    }

    return nil

}


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

    let itemController = viewController as! PageItemController

    if itemController.index < visibleVCS.count - 1 {


        return visibleVCS[itemController.index + 1]
    }

    return nil
}

@Zellb 的回答确实解决了这个问题。然而,这是我最终使用的代码,我发现它更易于管理:

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

    var index = indexOfViewController(viewController)!
    if (index != -1)
    {
        index++
        if (index >= visibleVCS.count)
        {
            return nil
        }
        else
        {
            return visibleVCS[index]
        }
    }
    return nil
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    var index = indexOfViewController(viewController)!
    if (index != -1)
    {
        index--
        if (index < 0)
        {
            return nil
        }
        else
        {
            return visibleVCS[index]
        }
    }
    return nil

}

func indexOfViewController(viewController : UIViewController) -> Int?
{
    for (var i = 0; i <= visibleVCS.count; i++)
    {
        if (viewController == visibleVCS[i])
        {
            return i
        }
    }
    return -1
}

在我的原始代码中,visibleVC 只是一个 UIViewController 数组。