UIPageViewController上的BAD_ACCESS

时间:2016-09-23 07:06:28

标签: ios swift uipageviewcontroller

我有一个工作UIPageViewController,其中包含多个UIViewControllers嵌入UINavigationController,每个UIViewController都预览了一系列图像,当时打开,实例化一个新的UIPageViewController以显示这些图像

当我浏览图片然后再刷回第一张图片时,我的应用程序崩溃了" EXC_BAD_ACCESS(code=EXC_I386_GPFLT)"当我使用UINavigationController

的后退按钮时,同样的事情

为什么会这样,我该如何解决这个问题?

我的PageViewController(标记的行是我在调试器崩溃之前得到的最后一行):

class DetailPageMasterViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource
{
    var presentationPageIndex: Int = 0

    var itemsArray = [Aktion]()
    var pageViewController: UIPageViewController!

    @IBOutlet weak var btnEditOutlet: UIBarButtonItem!
    @IBAction func btnEditAction(sender: AnyObject)
    {


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

        self.pageViewController = UIPageViewController.init(transitionStyle: .Scroll,
                                                            navigationOrientation: .Horizontal,
                                                            options: nil)

        self.pageViewController.delegate = self
        self.pageViewController.dataSource = self

        self.presentationPageIndex = 0
        let firstVC = self.viewControllerAtIndex(presentationPageIndex)
        let viewControllers = [firstVC]
        self.pageViewController.setViewControllers(viewControllers,
                                direction: .Forward,
                                animated: false,
                                completion: nil)

        self.addChildViewController(self.pageViewController)
        self.view.addSubview(self.pageViewController.view)
        self.pageViewController.didMoveToParentViewController(self)

        self.setupPageControl()
    }

    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)
    {
        if completed
        {
            let minionVC = self.pageViewController.viewControllers?.last as! DetailMinionViewController
            presentationPageIndex = minionVC.pageIndex
        }
    }

    func viewControllerAtIndex(index: Int) -> DetailMinionViewController
    {
        let contentVC = self.storyboard?.instantiateViewControllerWithIdentifier("MinionPageViewController") as! DetailMinionViewController
        contentVC.aktion = itemsArray[index]
        contentVC.pageIndex = index

        return contentVC
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
    {
        if let viewController = viewController as? DetailMinionViewController
        {
            var index = viewController.pageIndex

            if index == 0 || index == NSNotFound
            {
                return nil //MARKED LINE
            }

            index -= 1

            return self.viewControllerAtIndex(index)
        }

        return nil
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?
    {
        if let viewController = viewController as? DetailMinionViewController
        {
            var index = viewController.pageIndex

            if index == NSNotFound
            {
                return nil
            }

            index += 1

            if index == NSNotFound || index >= itemsArray.count
            {
                return nil
            }

            return self.viewControllerAtIndex(index)
        }

        return nil
    }

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int
    {
        return itemsArray.count
    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int
    {
        return presentationPageIndex
    }

    func setupPageControl()
    {
        UIPageControl.appearance().backgroundColor = UIColor.clearColor()
        UIPageControl.appearance().pageIndicatorTintColor = UIColor.whiteColor()
        UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.redColor()
    }
}

所以结构看起来像是 UINavigationController - > DetailPageMasterViewController - > DetailMinionViewController - > PicturesPageMasterViewController - > PicturesMinionViewController

2 个答案:

答案 0 :(得分:0)

所以我终于找到了导致我的应用崩溃的原因。

长话短说:
 $('#GraphName').jqplotSaveImage()中的gestureRecognizer试图访问已经取消初始化的PicturesMinionViewControllerImageView工作正常

答案 1 :(得分:-1)

请检查添加到PageController中的viewController的数量。如果可能,您可以共享您的代码。