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 

} 
} 

をですから、基本的には他のソースからコピー&ペーストされているだけです。これは、スクロールするpageTitles配列から4ページを作成し、別のVCでは1,2,3,4を渡します。ラベルはスクロールビューのように配列内のすべてを表示します。

問題は、私がpageTitlesをハードコードしないで、代わりにfirebaseから引っ張ってみるときです。

pageTitles配列をハードコーディングしている場所をコメントアウトすると、私はContentViewControllerで予期しないnil値を取得し、タイトルを送信しています。

私があれば/役立つだろうにものをロードするfirebase時間を許可するようにしましょうとそれを守るかもしれない考え出したので、私ならば、私は

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

何も、この問題が発生したときに画面に現れず、でした左または右にスクロールします。私はpagebefore/pageaftersでインデックスにエラーが発生します。

私はこれが非常にシンプルで、非常にtableviewに似ている必要がありますように感じる? firebaseからデータをロードし、配列に情報を入力し、/を使用してFirebaseをロードしてから、配列に基づいてUIを更新します。

答えて

1

あなたのDataServiceは非同期だと思います。データの準備が整ったら、ページビューコントローラを作成する必要があります。この変更されたviewDidLoadメソッドを試してください。 viewDidLoad FUNC

オーバーライド()

{

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) 

    } 

における}。

関連する問題