我有NSCollectionView
显示一些图片。我已经实现了NSCollectionViewDelegate
来告诉它应该选择和/或突出显示哪些项目。我正在使用股票NSCollectionViewItem
来绘制图像及其名称。当用户选择一个项目时,我的代理人会收到有关突出显示状态更改的消息:
- (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:
。我有什么问题吗?
我已经在视图的-drawRect:
方法中添加了一些日志记录,即使我在{{1}中调用-reloadItemsAtIndexPaths:
,它似乎也没有在所有转换上调用} 方法。为什么不?
我还注意到代理人的-didChange*
似乎没有被调用过,即使-should/didDeselectItemsAtIndexPaths:
被调用了。那是为什么?
答案 0 :(得分:3)
问题原来是调用[collectionView reloadItemsAtIndexPaths:]
。执行此操作后,它会删除现有的NSCollectionViewItem
并创建一个新的(通过调用您的数据源&#39; s collectionView:itemForRepresentedObjectAt:
)。这会立即将新的集合视图项设置为未选中(或者它不会将其设置为选中)。发生这种情况时,它不会调用您的should/didDeselect
方法,因为现有项目不再存在,并且未选择新项目。
真正的解决方案是子类NSCollectionViewItem
并覆盖-setSelected:
来执行以下操作:
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected];
[self.view setNeedsDisplay:YES];
}
当调用视图的-drawRect:
方法时,它会询问项目是否已选中并正确绘制。
因此,我可以毫无问题地从代理中完全删除所有should/did/select/Deselect
方法,而且一切正常!