2016-04-07 11 views
1

イメージのコレクションをダウンロードし、collectionViewにロードしました。個別のセルを押すたびにグローバルに宣言された配列に選択された個々の項目を追加できるようにしたいので、後でそれらをループしてコアデータから削除することができます。この行は、項目print( "あなたは#(indexPath.item)を選択しました!")の順番で表示されますが、2回目に別のセルを押して配列に追加すると、という致命的なエラーが発生します。インデックスが範囲外です。エラー。私は何を得ているのか分からない。Swift、CollectionView、致命的なエラー:インデックスが範囲外です。

var selectedCell: [Int] = []  -> Declared globally 


    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
     // handle tap events 

     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell 


     print("You selected cell #\(indexPath.item)!") 

     if self.selectedCell.contains(indexPath.item){ 
      print("Item already added") 
     } else { 
      self.selectedCell.append(indexPath.item) 
     } 

     if selectedCell.count > 0 { 
      toolbarButton.title = "Remove Item" 
     } 

//  let selectCell:UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! 
//  selectCell.contentView.backgroundColor = UIColor.whiteColor() 

    } 
+0

どの列で配列インデックス例外が発生しますか? – Paulw11

+0

self.selectedCell.append(indexPath.item) –

+0

それは他の行と思われます。 appendはあなたにその例外を与えることはできません。あなたのコードにある2つのコメント行は何ですか?なぜ彼らはコメントアウトされていますか? – Shripada

答えて

1

のiOS 9.3、Xcodeの7.3

私は正直にその「致命的なエラー:範囲外のインデックス」だと思う私はと思い、あなたが宣言した整数インデックスの単純な配列には適用されませんコレクションビュー自体のインデックスに関連付けられます。

UICollectionViewのさまざまなプロトコル、つまりUICollectionViewDataSource, UICollectionViewDelegateに準拠しているように見えます。少なくとも、選択したセルのメソッドにコールバックを受信して​​いるためです。私にジャンプ

まず最初は...

宣言toolbarButtonためtitleプロパティである場合titleが標準UIButtonクラスの設定ができ財産ではないので、それは、UIButtonのカスタムサブクラスです。これはもう一つ...あなたは、通常UIBUttonのタイトルを設定したいか

self.toolbarButton.setTitle("Remove Item", forState: .Normal) 

ある変数cellは、その関数で使用されることはありません、

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell 

あり、それはあなたに警告を与える必要があります。

また、アレイ変数selectedCellの使用方法をすべて確認してください。たとえば、self.selectedCellを使用していないカウント値をチェックするif文で確認してください。これが何をするのかはわかりませんが、配列が再合成されると思いますので、毎回カウントがリセットされます。

私が理解できない他の項目はほとんどありません。私が使用するコードはここにあります。コードと構文を確認してください。

次のコードは動作します。この中にあなたが同じセルをクリックすると、二回、それが追加されていません(:

enter image description here

注:

var selectedCell: [Int] = [] 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
{ 
    // handle tap events 

    print("You selected cell #\(indexPath.item)!") 

    if (self.selectedCell.contains(indexPath.item)) 
    { 
     print("Item already added") 
    } 
    else 
    { 
     self.selectedCell.append(indexPath.item) 
    } 

    print("selectedCell.count: \(self.selectedCell.count)") 

    if (self.selectedCell.count > 0) 
    { 
     self.toolbarButton.setTitle("Remove Item", forState: .Normal) 

     print("selectedCell: \(self.selectedCell)") 
    } 
    else 
    { 
     //nil 
    } 
} 

出力は次のようになりますcase 8)、配列内に少なくとも1つの項目があると、ボタンのタイトルが変更されます。

それでも、この記事を見た後、それを把握することができない場合、それは非常によくコレクションビューを実装する方法を説明します。https://stackoverflow.com/a/31735229/4018041

は、この情報がお役に立てば幸い!乾杯。

関連する問題