Col*_*eel 11 macos cocoa objective-c nscollectionview swift
我最近审查了我一年前发布的一个应用程序。而且我看到现在NSCollectionView它的内部已经失去了选择功能,例如 SHIFT + Select 现在它表现为 CMD + Select。
(第二个问题:用鼠标拖动时我也没有得到选择矩形。)
显然我想要这个功能回来,使用 shift 会将选择从先前单击的单元格扩展到 shift 单击的单元格。
我做了什么:
//NSCollectionView * _picturesGridView; //is my iVar
//In initialization I have set my _picturesGridView as follows
//Initializations etc are omitted -- (only the selection related code is here)
[_picturesGridView setSelectable:YES];
[_picturesGridView setAllowsMultipleSelection:YES];
Run Code Online (Sandbox Code Playgroud)
问题:是否有一种简单的方法可以恢复此功能?我在文档中没有看到任何相关的内容,并且在互联网上找不到任何解决方案。
子问题:如果没有简单的方法来实现这一点 -> 我应该继续创建自己的FancyPrefix##CollectionViewClass功能并按照我的意愿重新实现这个功能 - 还是最好跳过现有的NSCollectionView并强制它按照我的意愿行事?
子注:好吧,如果我发现自己重新实现它,它将是一个轻量级的类,它只会满足我自己的需求——我的意思是我不会模仿整个NSCollectionView类。
PS 我可以通过单击来选择一个项目我只能使用 CMD+Click 或 SHIFT+Click 来选择多个项目,但后者的行为与我不想要的 CMD+Click 完全一样。
至于鼠标选择矩形 - 我没有覆盖任何鼠标事件。不清楚为什么我没有这个功能。
我编写了一个执行此操作的示例,从示例代码开始git@github.com:appcoda/PhotosApp.git,我的所有更改都在 ViewController.swift 中。
我通过添加来跟踪班次是向上还是向下
var shiftDown = false
override func flagsChanged(with event: NSEvent) {
shiftDown = ((event.modifierFlags.rawValue >> 17) & 1) != 0
}
Run Code Online (Sandbox Code Playgroud)
我添加了这个实例变量来记住最后的选择
var lastIdx: IndexPath.Element?
Run Code Online (Sandbox Code Playgroud)
然后,在已经定义的基础上collectionView(_:didSelectItemsAt),我添加了
let thisIdx = indexPaths.first?[1]
if shiftDown, let thisIdx = thisIdx, let lastIdx = lastIdx {
let minItem = min(thisIdx, lastIdx)
let maxItem = max(thisIdx, lastIdx)
var additionalPaths = Set<IndexPath>()
for i in minItem...maxItem {
additionalPaths.insert(IndexPath(item: i, section: 0))
}
collectionView.selectItems(at: additionalPaths, scrollPosition: [])
}
lastIdx = thisIdx
Run Code Online (Sandbox Code Playgroud)
这只是一个开始。可能存在错误,尤其是在保存lastIdx.
| 归档时间: |
|
| 查看次数: |
902 次 |
| 最近记录: |