简体   繁体   中英

UIPageViewController crashing when not using static data

I have a working page view controller system with this ( just going to paste absolutely everything, pretty sure the issue just lies in my firebase observation near the top) :

class IndividualPeopleVC: UIViewController, UIPageViewControllerDataSource  {

var pageViewController: UIPageViewController!


var pageTitles : [String]!
var imageURLS: NSArray!

let currentUser = FIRAuth.auth()?.currentUser?.uid

override func viewDidLoad()

{

    super.viewDidLoad()

    self.pageTitles = []
    self.pageTitles = ["1", "2", "3", "4'"]
  DataService.ds.REF_INTERESTS.child(passedInterest).child("rooms").child(passedRoom).child("users").observeSingleEventOfType(.Value) { (snapshot: FIRDataSnapshot) in

        print(snapshot.value)
        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
            for snap in snapshots {

                let name = snap.key
                let uid = snap.value as! String

                let person = Person(name: name, bio: "", UID: uid)

                if person.UID != self.currentUser {

                 self.pageTitles.append(uid)
                }

        }

    }
self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController

    self.pageViewController.dataSource = self


    let startVC = self.viewControllerAtIndex(0) as ContentViewController

    let viewControllers = NSArray(object: startVC)

    self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil)

    self.pageViewController.view.frame = CGRectMake(0, 30, self.view.frame.width, self.view.frame.size.height - 60)

    self.addChildViewController(self.pageViewController)

    self.view.addSubview(self.pageViewController.view)

    self.pageViewController.didMoveToParentViewController(self)

}

func viewControllerAtIndex(index: Int) -> ContentViewController

{

    if ((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) {

        return ContentViewController()

    }

    var vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController

    vc.titleText = self.pageTitles[index] as! String
    vc.imageFile = self.pageImages[index] as! String

    vc.pageIndex = index

    return vc

}

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

{


    var vc = viewController as! ContentViewController

    var index = vc.pageIndex as Int

    if (index == 0 || index == NSNotFound)

    {

        return nil

    }


    index--

    return self.viewControllerAtIndex(index)

}

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

    var vc = viewController as! ContentViewController

    var index = vc.pageIndex as Int

    if (index == NSNotFound) {

        return nil

    }

    index++



    if (index == self.pageTitles.count){

        return nil

    }

    return self.viewControllerAtIndex(index)

}



func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int{

    return self.pageTitles.count

}


func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int{

    return 0

}
}

So basically most of that is just copy-pasted from another source and it works. It creates 4 pages from the pageTitles array that scroll and on another VC I am passing the 1,2,3 and 4 and a label is displaying everything in the array as the scrollview should.

The problem comes when I try to not hard-code the pageTitles and instead pull it from firebase.

When I comment out where I'm hard-coding the pageTitles array, I get an unexpected nil value on my ContentViewController where I'm sending the titles and I do like titleLabel.text = (what was sent over).

I figured maybe guarding it with an if/let to allow firebase time to load stuff in would help, so I did a

if let title = (what was sent over) {
 titleLabel.text = title
}

Nothing shows up on the screen when this happens, and then if I scroll left or right I get an error with indexes down in my pagebefore/pageafters.

I feel like this should be super simple and very similar to a tableview? Load in data from firebase, fill an array with the info, use if/lets to allow firebase some time to load in, then update the UI based on the array.

I think your DataService is asynchronous. You have to create your pageviewcontroller once your data is ready. Try this modified viewDidLoad method.

override func viewDidLoad()

{

super.viewDidLoad()

self.pageTitles = []

// self.pageTitles = ["1", "2", "3", "4'"] DataService.ds.REF_INTERESTS.child(passedInterest).child("rooms").child(passedRoom).child("users").observeSingleEventOfType(.Value) { (snapshot: FIRDataSnapshot) in

    print(snapshot.value)
    if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
        for snap in snapshots {

            let name = snap.key
            let uid = snap.value as! String

            let person = Person(name: name, bio: "", UID: uid)

            if person.UID != self.currentUser {

                self.pageTitles.append(uid)
            }

        }

        self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController

        self.pageViewController.dataSource = self


        let startVC = self.viewControllerAtIndex(0) as ContentViewController

        let viewControllers = NSArray(object: startVC)

        self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil)

        self.pageViewController.view.frame = CGRectMake(0, 30, self.view.frame.width, self.view.frame.size.height - 60)

        self.addChildViewController(self.pageViewController)

        self.view.addSubview(self.pageViewController.view)

        self.pageViewController.didMoveToParentViewController(self)

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM