如何在新的NSCollectionView中以编程方式选择对象(并使该对象显示为已选中)?

时间:2016-02-04 17:14:23

标签: swift macos nscollectionview

我在我的Mac应用程序中成功实现了10.11版本的NSCollectionView。它显示了我想要的10个项目,但我希望在应用程序启动时自动选择第一个项目。

我在viewDidLoad和viewDidAppear函数中尝试了以下内容;

let indexPath = NSIndexPath(forItem: 0, inSection: 0)
var set = Set<NSIndexPath>()
set.insert(indexPath)
collectionView.animator().selectItemsAtIndexPaths(set, scrollPosition:   NSCollectionViewScrollPosition.Top)

我已经尝试过使用和不使用动画师的第4行

我也试过以下代替第4行

collectionView.animator().selectionIndexPaths = set

有和没有动画师()

虽然它们都包含所选索引路径中的索引路径,但实际上都不会将该项显示为选中。

我出错的任何线索?

2 个答案:

答案 0 :(得分:2)

我建议不要使用滚动位置。在Swift 3中,viewDidLoad中的以下代码正在为我工​​作

    // select first item of collection view
    collectionView(collectionView, didSelectItemsAt: [IndexPath(item: 0, section: 0)])
    collectionView.selectionIndexPaths.insert(IndexPath(item: 0, section: 0))

第二个代码行是必需的,否则永远不会取消选择该项。 以下工作也是如此

        collectionView.selectItems(at: [IndexPath(item: 0, section: 0)], scrollPosition: NSCollectionViewScrollPosition.top)

对于这两个代码片段,必须有一个带有函数的NSCollectionViewDelegate

    func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
    // if you are using more than one selected item, code has to be changed
    guard let indexPath = indexPaths.first
        else { return }
    guard let item = collectionView.item(at: indexPath) as? CollectionViewItem
        else { return }
    item.setHighlight(true)
}

答案 1 :(得分:0)

根据Apple的文档,使用NSCollectionView的方法以编程方式选择项目不会调用NSCollectionViewDelegate的didSelect方法。因此,您必须自己添加突出显示。

override func viewDidAppear() {
    super.viewDidAppear()

    retainSelection()
}

private func retainSelection() {
    let indexPath = IndexPath(item: 0, section: 0)
    collectionView.selectItems(at: [indexPath], scrollPosition: .nearestVerticalEdge)
    highlightItems(true, atIndexPaths: [indexPath])
}

private func highlightItems(_ selected: Bool, atIndexPaths: Set<IndexPath>) {
    for indexPath in atIndexPaths {
        guard let item = collectionView.item(at: indexPath) else {continue}
        item.view.layer?.backgroundColor = (selected ? NSColor(named: "ItemSelectedColor")?.cgColor : NSColor(named: "ItemColor")?.cgColor)
    }
}