gpt4 book ai didi

objective-c - 使用 Shift 键扩展 NSCollectionView 中的选择

转载 作者:行者123 更新时间:2023-12-03 09:17:03 25 4
gpt4 key购买 nike

我最近审查了我一年前发布的一个应用程序。
我看到现在 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];
问题:有没有简单的方法来恢复这个功能?我在文档中没有看到任何相关的内容,并且在互联网上找不到任何解决方案。
子问题:如果没有简单的方法可以实现-> 我应该继续创建自己的 FancyPrefix##CollectionViewClass并按照我的意愿重新实现此功能 - 或者最好遍历现有的 NSCollectionView并强制它按照我的意愿行事?
子注:好吧,如果我发现自己重新实现它,它将是一个轻量级的类,它只会满足我自己的需求——我的意思是我不会模仿整个 NSCollectionView类(class)。
附言
我可以通过单击来选择一个项目我只能使用 CMD+Click 或 SHIFT+Click 来选择多个项目,但后者的行为与我不想要的 CMD+Click 完全一样。
至于鼠标选择矩形 - 我没有覆盖任何鼠标事件。不清楚为什么我没有这个功能。

最佳答案

根据 Apple 的文档,shouldSelectItemsAtIndexPaths:是仅在用户与 View 交互时调用的事件,而不是在选择被自己的代码修改时调用。因此,这种方法避免了使用 didSelectItemsAt: 时可能出现的副作用。 .
它的工作原理如下:

  • 它需要记住之前点击的项目。此代码假定 NSCollectionView实际上是一个名为 CustomCollectionView 的子类具有属性 @property (strong) NSIndexPath * _Nullable lastClickedIndexPath;
  • 当它是一个简单的选择点击时,它只记住上次点击的项目,但不会记住,例如,具有多个选定项目的拖动选择。
  • 如果它检测到第二次按下 Shift 键的单选单击,它会选择从最后一次单击到当前单击范围内的所有项目。
  • 如果某个项目被取消选择,我们会清除上次点击的项目以更好地模拟预期行为。
  • - (NSSet<NSIndexPath *> *)collectionView:(CustomCollectionView *)collectionView shouldDeselectItemsAtIndexPaths:(NSSet<NSIndexPath*> *)indexPaths
    {
    collectionView.lastClickedIndexPath = nil;
    return indexPaths;
    }

    - (NSSet<NSIndexPath *> *)collectionView:(CustomCollectionView *)collectionView shouldSelectItemsAtIndexPaths:(NSSet<NSIndexPath*> *)indexPaths
    {
    if (indexPaths.count != 1) {
    // If it's not a single cell selection, then we also don't want to remember the last click position
    collectionView.lastClickedIndexPath = nil;
    return indexPaths;
    }
    NSIndexPath *clickedIndexPath = indexPaths.anyObject; // now there is only one selected item
    NSIndexPath *prevIndexPath = collectionView.lastClickedIndexPath;
    collectionView.lastClickedIndexPath = clickedIndexPath; // remember last click
    BOOL shiftKeyDown = (NSEvent.modifierFlags & NSEventModifierFlagShift) != 0;
    if (NOT shiftKeyDown || prevIndexPath == nil) {
    // not an extension click
    return indexPaths;
    }
    NSMutableSet<NSIndexPath*> *newIndexPaths = [NSMutableSet set];
    NSInteger startIndex = [prevIndexPath indexAtPosition:1];
    NSInteger endIndex = [clickedIndexPath indexAtPosition:1];
    if (startIndex > endIndex) {
    // swap start and end position so that we can always count upwards
    NSInteger tmp = endIndex;
    endIndex = startIndex;
    startIndex = tmp;
    }
    for (NSInteger index = startIndex; index <= endIndex; ++index) {
    NSUInteger path[2] = {0, index};
    [newIndexPaths addObject:[NSIndexPath indexPathWithIndexes:path length:2]];
    }
    return newIndexPaths;
    }
    此答案已制作为“社区维基”,以便任何人都可以改进此代码。如果您发现错误或可以使其表现更好,请执行此操作。

    关于objective-c - 使用 Shift 键扩展 NSCollectionView 中的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35342986/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com