我在cocoa应用程序中设置了NSCollectionView
。我已经将集合视图的NSCollectionViewItem
子类化为在选择/取消选择其中一个视图时向我发送自定义NSNotification
。发布此通知时,我注册在我的控制器对象中接收通知。在这个方法中,我告诉刚刚被选中的视图被选中并告诉它重绘,这使得它自己变成灰色。
NSCollectionViewItem
子类:
-(void)setSelected:(BOOL)flag {
[super setSelected:flag];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ASCollectionViewItemSetSelected"
object:nil
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:(ASListView *)self.view, @"view",
[NSNumber numberWithBool:flag], @"flag", nil]];}
控制器类(在-(void)awakeFromNib
方法中):
//Register for selection changed notification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(selectionChanged:)
name:@"ASCollectionViewItemSetSelected"
object:nil];
-(void)selectionChanged:(NSNotification *)notification
方法:
- (void)selectionChanged:(NSNotification *)notification {
// * * Must get the selected item and set its properties accordingly
//Get the flag
NSNumber *flagNumber = [notification.userInfo objectForKey:@"flag"];
BOOL flag = flagNumber.boolValue;
//Get the view
ASListView *listView = [notification.userInfo objectForKey:@"view"];
//Set the view's selected property
[listView setIsSelected:flag];
[listView setNeedsDisplay:YES];
//Log for testing
NSLog(@"SelectionChanged to: %d on view: %@", flag, listView);}
包含此代码的应用程序要求集合视图中的任何时候都不能有空选择。这是我遇到问题的地方。我已经尝试检查视图的选择何时更改,如果没有选择则重新选择,并使用NSCollectionView
的
-(void)setSelectionIndexes:(NSIndexSet *)indexes
但是总会出现导致集合视图中出现空选择的情况。
所以我想知道是否有更简单的方法可以防止NSCollectionView
中出现空选?我在界面构建器中看不到任何复选框。
提前致谢!
本
更新
我最后只是继承了NSCollectionView
,并覆盖了- (void)mouseDown:(NSEvent *)theEvent
方法。如果点击位于其中一个子视图中,我才会发送方法[super mouseDown:theEvent];
。代码:
- (void)mouseDown:(NSEvent *)theEvent {
NSPoint clickPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
int i = 0;
for (NSView *view in self.subviews) {
if (NSPointInRect(clickPoint, view.frame)) {
//Click is in rect
i = 1;
}
}
//The click wasnt in any of the rects
if (i != 0) {
[super mouseDown:theEvent];
}}
答案 0 :(得分:0)
我最后只是继承了我的NSCollectionView,并重写了- (void)mouseDown:(NSEvent *)theEvent
方法。我才发送方法[super mouseDown:theEvent];如果点击是在其中一个子视图中。代码:
- (void)mouseDown:(NSEvent *)theEvent {
NSPoint clickPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
int i = 0;
for (NSView *view in self.subviews) {
if (NSPointInRect(clickPoint, view.frame)) {
//Click is in rect
i = 1;
}
}
//The click wasnt in any of the rects
if (i != 0) {
[super mouseDown:theEvent];
}}
答案 1 :(得分:0)
我还想在集合视图中避免空选
我这样做的方式也是通过子类化,但是如果点击不在项目上,我会覆盖-hitTest:
而不是-mouseDown:
来返回nil
:
-(NSView *)hitTest:(NSPoint)aPoint {
// convert aPoint in self coordinate system
NSPoint localPoint = [self convertPoint:aPoint fromView:[self superview]];
// get the item count
NSUInteger itemCount = [[self content] count];
for(NSUInteger itemIndex = 0; itemIndex < itemCount; itemIndex += 1) {
// test the point in each item frame
NSRect itemFrame = [self frameForItemAtIndex:itemIndex];
if(NSPointInRect(localPoint, itemFrame)) {
return [[self itemAtIndex:itemIndex] view];
}
}
// not on an item
return nil;
}
答案 2 :(得分:0)
虽然我迟到了这个帖子,但我以为我只是插话,因为我最近遇到了同样的问题。我使用以下代码行解决了这个问题:
[_collectionView setValue:@NO forKey:@"avoidsEmptySelection"];
有一点需要注意:avoidsEmptySelection
属性不是官方API的一部分,尽管我认为假设它的属性类型会坚持一段时间是非常安全的。