2016-12-08 32 views
2

私はUICollectionViewがカレンダーです。スクロール可能な1行です。その日付のデータがないため、一部の日付は選択できません。他のものはその日付のデータがあるので選択可能です。コレクションビューを停止してアイテムの選択を解除する

日付が選択されると、カレンダーは選択された日付に下線を引いて、UICollectionViewの中心にスクロールします。これは、これらのセルが選択されて停止し

override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool { 
    return //is there data for the date at this indexPath? 
} 

私はこの機能を持っている日付を持っていない日がタップされる

は... ...しかし、それはまだ以前に選択したセルの選択が解除されます。

shouldDeselect機能がありますが、これはタップしたセルのインデックスがわからないため使用できません。だから私は、項目を選択解除する必要があるかどうかを判断することはできません。

これを行うには良い方法がありますか?

+0

あなたは 'collectionViewを設定してみてくださいました.allowsMultipleSelection'をtrueにしますか? – ebby94

+0

@ ebby94 1回の選択だけが許されるので、私はそれをしませんでした。私が抱えている問題は、アイテムを選択すべきではなく、以前に選択したアイテムを選択解除しているということです。 – Fogmeister

+0

これを復活させるのは嫌ですが、最近私はXamarin iOSでこの問題を抱えていました。これをAllowsMultipleSelectionをTrueに設定するのが最も簡単な方法でした。コードの残りの部分はクリアされ、選択された単一の項目が設定されるため、「複数選択された項目」が発生することはありませんでした。私のユースケースは、CollectionViewをベースとしたカスタムカレンダーコントロールであり、上部のMTWTFSSは選択可能ではなく、以前に選択した項目には影響しません。これは完全に私のために働いた。 – Adam

答えて

1

私は最近、同じ問題を持っていたし、私は次のようなアプローチになってしまった:ユーザーがセルを選択するたびに、メンバ変数で位置を

覚えている:その呼び出しmyCollectionView.reloadData()

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     myMemberVariable = indexPath.row 
} 

cellForRowAtIndexPath:には、セルに適切な設定を適用してください。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MyCell.identifier, for: indexPath) as! MyCell 
    if indexPath.row == myMemberVariable && canSelectCellAt(indexPath: indexPath) { 
     cell.backgroundColor = .green 
    } else { 
     cell.backgroundColor = .gray 
    } 

    return cell 
} 
は、選択セルおよび非選択セルのための falseため trueを返す関数であり、

+0

ああ、大丈夫です。意味をなさない私は選択したインデックスを保存することを考えていました。行くだろう。ありがとう。 – Fogmeister

1

私にとってそれは簡単な作品私はcollectionviewをリロード:

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool { 
    // return true whithout reloadData when necessarily 
    collectionView.reloadData() 
    return false 
} 
関連する問題