2015-01-13 64 views
7

UICollectionView私はオフスクリーン時にソースデータが変更されることがあります。collectionView:reloadDataは動作しません、reloadItemsAtIndexPathsはありません

override func viewWillAppear(animated: Bool) { 
    self.collectionView!.reloadData() 
} 

を...、それは動作しますが、私は私のUICollectionViewに1つのまたは2つ以上のセルを更新する必要はありませんので、私はそれがあると思った:それは返すときにそれを更新するには、私はCollectionViewControllerに書きました

override func viewWillAppear(animated: Bool) { 
    self.collectionView!.reloadItemsAtIndexPaths(myArrayOfIndexPaths) 
} 

...しかし、私が行うとき、Xcodeのが言って私にエラーを与える::「!」接尾辞の

オペランド私は上記のバージョンを交換した場合、より良いです、オプションのタイプを持って削除しなければならない「!」」。

を私は削除すると 『を!』、それはUICollectionViewはメンバーがreloadItemsAtIndexPathsの名前がないことを言います。私が間違って何をしているのですか?

+0

がreloadItems' –

+0

'とコードのバージョンを表示し、あなたはそれでコレクションビューでUICollectionViewController、またはのUIViewControllerを使用していますか?後者の場合、どのように "collectionView"を宣言していますか? – rdelmar

+0

@David - 私の試みを '.reloadItemsAtIndexPaths'で試してみました。 @rdelmar - 私はUICollectionViewControllerを使用しています ありがとう! –

答えて

17

をあなたからコードそれはあなたが最後にオプションとしてごcollectionView(?付き)を宣言し、多分@IBOutletを使用して、ストーリーボードにそれをリンクされているように見えるあなたの問題を解決するには、削除すべきであるから:。?

@IBOutlet var collectionView: UICollectionView?

と置き換えてください:

@IBOutlet var collectionView: UICollectionView!

この方法(あなたがあなたのストーリーボードからそれをリンクされているので)あなたがcollectionViewは間違いなく存在するコンパイラを語っています。あなたは、単一のセルのために再ロードする場合は、特定のを指定することができます

if let collectionView = collectionView { 
    collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths) 
} 
+1

それはそれです - ありがとう!完全な初心者の質問に答えるための説明と感謝を感謝します! –

+0

あなたは大歓迎です! – Valentin

3

スウィフト3バージョンコード

var indexPaths = [IndexPath]() 
indexPaths.append(indexPath) //"indexPath" ideally get when tap didSelectItemAt or through long press gesture recogniser. 
collectionView.reloadItems(at: indexPaths) 
+1

どこからindexPathsを取得するのですか?厳密にスイフト3してください。 – nyxee

+0

@nyxee私は次のコードがあなたを理解するのを助けることを願っています。 funcコレクションビュー(コレクションビュー:UICollectionView、cellForItemAt indexPath:IndexPath) - > UICollectionViewCell { indexPaths.append(indexPath) } – mriaz0011

+0

私はコードを理解しています。問題は、reloadData()が、自分のdataSource haseに値が設定されていても、indexPathsを更新していないことです。これは私がより高いインデックス(サーバーから)の値にアクセスすることはできませんが、私はサーバーデータをダウンロードする前に手動で入力するサンプルデータにしかアクセスできないことを意味します。 – nyxee

0

また、あなたはこれを行うことによって、あなたのcollectionViewをバインドすることができますこのようなセル: -

for index in indexPaths { 
      if index == [0, 0] { 
       print(index) 
       self.collectionView?.reloadItems(at: [index]) 
      } 
     } 

希望これは役に立ちます。

1

スウィフト4リロードセクション

内のすべての項目
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    var indexPaths: [NSIndexPath] = [] 
    for i in 0..<collectionView!.numberOfItems(inSection: 0) { 
     indexPaths.append(NSIndexPath(item: i, section: 0)) 
    } 
    collectionView?.reloadItems(at: indexPaths as [IndexPath]) 
} 
関連する問題