【问题标题】:UIPageViewController Implementation - Black Screen After Changing View ControllersUIPageViewController 实现 - 更改视图控制器后黑屏
【发布时间】:2015-05-14 05:07:15
【问题描述】:

尝试成功实现一个允许用户使用 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];
}
}

【问题讨论】:

  • 你有任何错误信息吗?

标签: ios swift uiviewcontroller uipageviewcontroller


【解决方案1】:

将索引保存为 UIPageViewController 中的属性也不适用于我。为了解决这个问题,我必须创建一个具有 index 属性的基本 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
}

【讨论】:

  • 感谢您的回答,我会尽快查看。
  • @Naxin 你查了吗?结果如何?
  • 我确实试过了,我相信这个问题确实是我做过的其他测试的索引的结果。尽管我认为这是与故事板相关的问题,但由于崩溃,我还无法使用此解决方案使其正常工作。仍在调试中,如果是这种情况,将接受此解决方案!
  • 你在说什么类型的崩溃?至于情节提要,请尝试从 UIPageViewController 分别启动每个 VC 并检查是否有任何一个显示黑屏
  • 感谢Zellb的帮助,非常感谢!我选择了你的答案,但按照我下面的答案实施(灵感来自你对索引的使用)。
【解决方案2】:

@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 数组。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多