- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个正在显示一些图像的NSCollectionView
。我已经实现了一个 NSCollectionViewDelegate 来告诉它应该选择和/或突出显示哪些项目。我正在使用库存 NSCollectionViewItem
来绘制图像及其名称。当用户选择一个项目时,我的委托(delegate)会收到有关突出显示状态更改的消息:
- (void)collectionView:(NSCollectionView *)collectionView
didChangeItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
toHighlightState:(NSCollectionViewItemHighlightState)highlightState
{
[collectionView reloadItemsAtIndexPaths:indexPaths];
}
我对 didSelect
/didDeselect
做了类似的事情:
- (void)collectionView:(NSCollectionView *)collectionView
didSelectItemsAtIndexPaths:(nonnull NSSet<NSIndexPath *> *)indexPaths
{
[collectionView reloadItemsAtIndexPaths:indexPaths];
}
在 NSCollectionViewItem
的 view
中,我执行以下操作:
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
NSColor* bgColor = [[self window] backgroundColor];
NSColor* highlightColor = [NSColor selectedControlColor];
NSRect frame = [self bounds];
NSCollectionViewItemHighlightState hlState = [collectionViewItem highlightState];
BOOL selected = [collectionViewItem isSelected];
if ((hlState == NSCollectionViewItemHighlightForSelection) || (selected))
{
[highlightColor setFill];
}
else
{
[bgColor setFill];
}
[NSBezierPath fillRect:frame];
}
我看到的问题是绘制突出显示或选择似乎是随机的。当它绘制选择时,它几乎总是在用户实际选择的项目上(尽管它经常由于某种原因遗漏最后一个项目)。有时,它会选择用户未单击或拖动的不同项目。但通常情况下,它只是不画画。
我添加了打印来验证它是否正在调用 -didChangeItemsAtIndexPaths:toHighlightState:
和 -didSelectItemsAtIndexPaths:
。我在这里做错了什么吗?
我已经向 View 的 -drawRect:
方法添加了一些日志记录,即使我正在调用 -reloadItemsAtIndexPaths:
在 -didChange*
方法中。为什么不?
我还注意到委托(delegate)的 -should/didDeselectItemsAtIndexPaths:
似乎从未被调用过,即使 -should/didSelectItemsAtIndexPaths:
确实被调用了。这是为什么?
最佳答案
问题原来是调用[collectionView reloadItemsAtIndexPaths:]
。当您执行此操作时,它会删除现有的 NSCollectionViewItem
并创建一个新的(通过调用数据源的 collectionView:itemForRepresentedObjectAt:
)。这会立即将新的 Collection View 项设置为未选择(或者更确切地说,它不会将其设置为选择)。发生这种情况时,它不会调用您的 should/didDeselect
方法,因为现有项目不再存在,并且不会选择新项目。
真正的解决方案是子类 NSCollectionViewItem
并重写 -setSelected:
来执行以下操作:
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected];
[self.view setNeedsDisplay:YES];
}
当 View 的 -drawRect:
方法被调用时,它会询问该项目是否已被选择并正确绘制。
因此,我可以毫无问题地从委托(delegate)中完全删除所有 should/did/select/Deselect
方法,而且一切都正常!
关于objective-c - 如何在 NSCollectionView 中正确显示当前选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41670851/
我正在为 macOS 实现一个应用程序,我在其中使用 NSCollectionView 作为一种时间轴。为此,我使用了 NSCollectionViewFlowLayout 的自定义子类,原因如下:
我有一个带有 3 个 NSTableViews 和 1 个 NSCollectionView 的窗口。集合 View 显示图像。我希望能够选择其中一个图像并使用键盘删除键将其删除,但我无法让 coll
我正在开发在 NSCollectionView 中显示 svg 图标的应用程序。我想实现拖放功能,以允许用户将 svg 拖到 Finder 或其他应用程序。我有两个问题: 1.) 为了实现对另一个应用
我在网上寻找了这个,但我找不到任何关于如何成功实现 NSCollectionView 的明确教程。我应该如何进行? 在Interface Builder中,我可以将一个NSCollectionView
我有一个NSCollectionView其中 subview 之一是 NSImageView 。实际图像需要在执行 API 调用后从网络服务器加载(因此实际上是两个网络请求)。显然我需要异步加载图像。
我有一系列项目,我在 NSCollectionView 中显示它们。选择和多重选择均已启用。 用户可以通过拖动来选择项目(即通过拖动来标记项目)。但是,当用户开始从 Collection View 背
我最近让我的 NSCollectionView 正常工作,它以正确的方式处理部分。我通过添加“选定”模型 key 路径的绑定(bind)来实现此目的。此操作隐藏蓝色 View ,向用户显示选择。问题是
在我的 Collection View 中,我需要为每个项目生成一个索引。当项目重新排序时,我需要此索引更新其新位置。 数据是托管 NSArrayController 中的核心数据实体。我最接近的可能
我试图通过实现 -(void)magnifyWithEvent:(NSEvent *)event 在 NSCollectionView 中进行捏缩放,但我不确定在这个方法中要做什么。我通过 [even
我尝试遵循本指南: Quick Start for Collection Views 在 Collection View 项中使用 NSImageView。 什么也没有显示,无论我用图像设置图像还是通
当我制作 NSCollectionView UI 时... 第一次,我使用 注册了我的 Collection View 项目类 self.cv.register(NSNib.init(nibNamed
假设我在 Collection View 中有一个项目,该项目将在 Collection View 的第一行居中。 对于多个项目,所有这些项目都将在 Collection View 中水平分布,并在它
我有一个 NSCollectionView 绑定(bind)到一个 NSArrayController,其中包含 NSMutableArray 作为内容。 NSMutableArray 中的项目按其应
我有一个 NSCollectionView,它由消息应用程序中的数十行单列项目(聊天消息)组成。 每个项目都包含一个高度不同的文本区域。因此,在创建 View 时 View 应默认位于底部,并在收到新
我需要在 NSCollectionView 中进行拖放。 所以我查看了苹果的代码示例: https://developer.apple.com/library/mac/#samplecode/Icon
我正在尝试从 NSCollectionView 中获得类似延迟加载的行为。 (老实说,我以为它有它,就像 UITableView - 似乎是一个明显的遗漏?) 无论如何,我正在单元格中显示图像,并且希
我试图让我的程序识别 NSCollectionView 的双击。我尝试遵循本指南:http://www.springenwerk.com/2009/12/double-click-and-nscoll
我正在尝试在 NSCollectionView 中实现拖放,这将允许重新排列 View 中的单元格。我已经设置了委托(delegate)并实现了以下方法: -(BOOL)collectionView:
NSCollectionView 仍然是我所见过的 Cocoa API 中最神秘的部分之一。文档很差,并且有许多移动部件,其中许多通常在 Interface Builder 中实现,这使得文档变得具有
我正在创建一个没有 xib/storyboard 的 NSCollectionview,当触摸项目时,collectionView:didSelectItemsAt: 方法从未调用过。在 viewdi
我是一名优秀的程序员,十分优秀!