2016-07-11 13 views
0

これにアプローチする方法に関するガイダンスが必要です。私は完全にそれを複雑にしているのか、それとも混乱しているのか分かりません。UICollectionViewグリッドにポストを挿入しますか?

私は常に9個のセルを持っていて、ユーザーがセルをタップして投稿を挿入できるようにしたいと思っています。セル8を押すと、 8番目のセルに8つの空のセルがある可能性があります。

私が投稿しています/ので、私のようなものに見えるために必要な流れを考えていた... firebaseからこれらの記事を引っ張っ:セルが表示されるように

1)9空の[記事]の空の配列を作成しますクリック可能です。

2)firebaseオブザーバで..もし返ってきた3つのポストがあれば、それらはpost配列に挿入されます/ 3つの空のポストを置き換えます。

3)グリッド全体にランダムに並べ替えを表示したいので、データをリロードする前に配列をシャッフルすると思いますか?

4)firebaseから戻ってきた投稿が、ユーザーが投稿したのと同じ場所にあるかどうかは気にしませんが、ユーザーが投稿と同じ場所に投稿するときそれを配置したので、私は "position:8"のような変数をfirebaseに保存すると思いました。「あなたのユーザuid =投稿のuidなら、位置番号を取得してそのインデックスに投稿を挿入する?。配列の私は、テーブルビュー/コレクションビューに特定の位置にアイテムを挿入についてはあまり見ていない

はベースオフこのフローの方法であるか、これを達成するためのより良い方法はあり

編集。:

func fillWithBlanks() { 
     for i in 0 ..< 9 { 

      let blankPost = Post(timestamp: 99999999999999999, picURL: nil, postKey: "") // 100% need a better timestamp there, just filler for now. 

      postsArray.append(blankPost) 

     } 
    } 

、その後

DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").queryStartingAtValue(cutoff).observeEventType(.ChildAdded, withBlock: { (snapshot:FIRDataSnapshot) in 


    let time = snapshot.value!["timestamp"] as? Int 
    let text = snapshot.value!["text"] as? String 
    let picURL = snapshot.value!["imageURL"] as? String 
    let key = snapshot.key 

    let post = Post(timestamp: time!, picURL: picURL!, postKey: key) 

    self.postsArray[self.selectedPostIndex] = post 

    self.collectionView.reloadData() 

}) 

そこで、基本的のviewDidLoad上のIは)(fillWithBlanksを呼んでいる、と私は選択したときに、私はインデックスにselectedPostIndexを設定されたセルはポストを作成し、クリック、およびインサートそれは私が選んだ場所です。

これは動作し、私は私の大規模な問題

99999999私はそれを押したときに、セルのタイムスタンプをプリントアウトし、私はポストを作るときのタイムスタンプがポストにappropraiteで十分に確認してくださいでそれをテストしていません私は写真があります。私がロードすると、空の9個のセルが得られますが、ポストを作ると9個すべてのセルにポストを設定した画像が設定され、2個のポストを作成するとSimon-says'ieが点滅します空白セルからの最初の画像、2番目の画像、および空白の背景の間のすべてのセル。

私はポストを作成するときにfirebaseにダウンロードURLを保存しています。そして、私はポストをダウンロードするキャッシングシステムを持っています。空白のポストを実装しようとする前にすべて機能しました。

何が原因でしょうか?なぜ新しい投稿を追加すると、アプリが読み込まれたときに私が作っている空白の投稿に何かをする理由が分かりません。私はクラスと私のポスト配列/ポストオブジェクトが何か必要なものではないといくつかの誤解を持っていると仮定しています。


編集2:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let post = postsArray[indexPath.row] 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MainCell", forIndexPath: indexPath) as! PostCell 

    if let imageURL = post.picURL { 

     cell.cellImage.loadImageUsingNSCache(imageURL) 


    } 

    return cell 

} 

と.loadimagesUsingNSCacheがから来ている:コレクションビューセルを覚えて、画像に問題について

extension UIImageView { 

func loadImageUsingNSCache(urlString: String){ 


    if let cachedImage = imageCache.objectForKey(urlString) as? UIImage { 
     self.image = cachedImage 
     return 
    } 
     let url = NSURL(string: urlString) 
     NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in 

      if error != nil { 
       print(error) 
       return 
      } 
      dispatch_async(dispatch_get_main_queue(), { 

       if let downloadedImage = UIImage(data: data!) { 

        imageCache.setObject(downloadedImage, forKey: urlString) 


        self.image = UIImage(data: data!) 
       } 





      }) 


     }).resume() 
    } 
+0

これは素晴らしいことですが、コードを書き込んで質問を結果に更新する必要があります。特定の問題がある場合、その方法で他の人があなたを助けることができます。 –

+0

申し訳ありませんが、私はちょうど私がベースや何かから離れていた場合のためにコードを書くのが少し疲れました。入力のおかげで今何かを調理しようとするつもり:) – Noowoo

+0

自分の翼を切らないでください:) –

答えて

2

再利用可能なアイテムなので、あなたがする必要がありますcollectionView(cellForItemAtIndexPath)に電話するたびに、すべての商品の内容をお知らせください。

つまり、post.picURLnilであっても、毎回cell.cellImageの値を指定する必要があります。その場合はcell.cellImage = nilと言ったり、デフォルトの空の画像を表示したりすることができます。

関連する問題