2016-08-31 4 views
0

У меня есть рабочая страница системы вид контроллера с этим (только собирается вставить абсолютно все, уверен, что этот вопрос просто лежит в моем firebase наблюдения вблизи вершины):UIPageViewController сбой, когда не используя статические данные

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 

} 
} 

Таким образом, в основном большая часть из них просто скопирована из другого источника и работает. Он создает 4 страницы из массива pageTitles, которые прокручиваются, а на другом VC я передаю 1,2,3 и 4, а метка отображает все в массиве, как это должно выглядеть scrollview.

Проблема возникает, когда я стараюсь не жестко закодировать pageTitles и вместо этого вытащить ее из firebase.

Когда я комментирую, где я жестко кодирую массив pageTitles, я получаю неожиданное значение nil в своем ContentViewController, где я отправляю заголовки, и мне нравится titleLabel.text = (то, что было отправлено).

Я подумал, может быть охраняя его с если/позволить, чтобы firebase время загрузки материала в помогло бы, так что я сделал

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

Ничто не появляется на экране, когда это происходит, а затем, если я прокрутка влево или вправо. Я получаю сообщение об ошибке с индексами на моих страницах.

Я чувствую, что это должно быть очень просто и очень похоже на табличное представление? Загружайте данные из firebase, заполняйте массив информацией, используйте if/allow, чтобы позволить firebase некоторое время для загрузки, а затем обновить интерфейс на основе массива.

ответ

1

Я думаю, что ваш DataService является асинхронным. Вы должны создать свой монитор просмотра страниц, как только ваши данные будут готовы. Попробуйте этот модифицированный метод viewDidLoad.

переопределение FUNC viewDidLoad()

{

super.viewDidLoad() 

self.pageTitles = [] 

// self.pageTitles = [ "1", "2", "3", "4' "] DataService.ds. REF_INTERESTS.child (passedInterest) .child ("комнаты") ребенок (passedRoom) .child ("пользователи") observeSingleEventOfType (.Value) {(снимок: FIRDataSnapshot) в

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) 

    } 

}..

Смежные вопросы