web-dev-qa-db-ja.com

コレクションビューでアイテムをプログラムで選択する方法

UICollectionViewがあります。 UICollectionViewdatasourceは、_NSArrayからの学生のCoreDataです。現在の学生アイテムをselected/highlightedにする必要があります。

これどうやってするの?私は方法があることを知っています:

- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath 
                     animated:(BOOL)animated 
               scrollPosition:(UICollectionViewScrollPosition)scrollPosition;

NSIndexPathおよびUICollectionViewScrollPositionを引数として取ります。

データソース(NSArrayから移入された学生のCoreData)と、selectedである学生オブジェクトがあります。

それで、どのようにしてNSIndexPathUICollectionViewScrollPositionを取得しますか?または、アイテムを強調表示する他の方法はありますか?

20
mrd

[self.collectionView reloadData]の後に単にこれを使用できます

[self.collectionView 
   selectItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0] 
                animated:YES
          scrollPosition:UICollectionViewScrollPositionCenteredVertically];

ここで、indexは、選択した生徒のインデックス番号です。

31
Shahin

スイフト

let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)
12
Krunal

あなたの質問から、選択した学生が1人だけだと仮定していますが、ユーザーが選択できるアイコンのコレクションを使用して同様のことを行いました。まず、私がやったロードで見ました:

override func viewDidLoad() {
    super.viewDidLoad()

    iconCollectionView.delegate = self
    iconCollectionView.dataSource = self
    iconCollectionView.allowsMultipleSelection = false
    iconCollectionView.selectItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 0), animated: false, scrollPosition: .None)
}

ここでは、デフォルトで最初のセルを選択します。StudentArray.indexOf選択した学生インデックスを取得します。次に、選択されたアイテムを表示するために、私がやった:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = iconCollectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! IconCollectionViewCell
    cell.imageView.image = UIImage(named: imageResourceNames.pngImageNames[indexPath.row])
    if cell.selected {
        cell.backgroundColor = UIColor.grayColor()
    }
    return cell
}

これは、コレクションが最初に表示されたときに呼び出され、選択の変更に反応します。

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor()
}

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.clearColor()
}

セルの選択を表示する方法はたくさんあります。私の方法は簡単ですが、それだけで十分です。

編集:上記を投稿してから、セルクラスのselectedにオブザーバーを追加する方が簡単だとわかりました。

class IconCollectionViewCell: UICollectionViewCell {

...

    override var selected: Bool {
        didSet {
            backgroundColor = selected ? UIColor.grayColor() : UIColor.clearColor()
        }
    }
}

これを適切に配置すると、didSelectまたはdidDeselectを処理したり、cellForItemAtIndexPathで選択されていることを確認したりする必要がなくなり、セルが自動的に処理します。

7
sgib
let indexPathForFirstRow = IndexPath(row: 0, section: 0)
    paymentHeaderCollectionView.selectItem(at: indexPathForFirstRow, animated: false, scrollPosition: UICollectionViewScrollPosition.left)
    self.collectionView(paymentHeaderCollectionView, didSelectItemAt: indexPathForFirstRow)
0