我有NSCollectionView一个小问题但很关键的例外.获取并突出显示集合中的所选项目.
在Snow Leopard之前我已经完成了所有这些工作,但是有些东西似乎发生了变化,我无法完全按照它进行操作,所以我把我的NSCollectionView右手放回基本测试并按照Apple的文档创建了一个NSCollectionView:
根据快速入门指南,集合视图可以正常工作.但是,本指南不讨论除了以外的选择"There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected".
以此为例,我进入了将Array Controller NSCollectionView与控制器键绑定的下一步selectionIndexes,认为这将绑定我NSCollectionView在阵列控制器之间做出的任何选择,从而触发KVO通知.我还设置了NSCollectionView在IB中可选择.
似乎没有选择委托,NSCollectionView并且与大多数Cocoa UI视图不同,似乎没有默认的选定突出显示.
所以我的问题实际上归结为一个相关的问题,但有两个截然不同的问题.
NSCollectionView编程指南似乎很少,而且大多数通过Google搜索似乎都会提升Snow Leopard之前的实现,或者在单独的XIB文件中使用该视图.
对于后者(视图的单独XIB文件),我不明白为什么这应该是先决条件,否则我会怀疑Apple不会将视图包含在与集合视图项相同的包中.
我知道这将是一个"无法看到木头为树"的问题 - 所以我已经为"doh!"做好了准备.时刻.
像往常一样,任何和所有帮助非常感谢.
更新1
好的,所以我想找到所选的项目,但尚未确定突出显示.有兴趣计算所选项目(假设您正在关注Apple指南):
在控制器中(在我的测试用例中,App Delegate)我添加了以下内容:
在awakeFromNib中
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Run Code Online (Sandbox Code Playgroud)
新方法
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController …Run Code Online (Sandbox Code Playgroud) cocoa objective-c nsview nscollectionview nscollectionviewitem
NSCollectionView仍然是我见过的Cocoa API中最神秘的部分之一.文档很差,并且有许多移动部件,其中许多通常在Interface Builder中实现,使文档具有挑战性.
请提供示例代码以创建最简单的情况,NSCollectionView其中显示文本字段或按钮而不使用Xcode,其中每个文本字段或按钮具有不同的标题.假设一个新的Xcode项目使用默认的windowIBOutlet.
对于此示例,在数据源更改时不需要绑定来更新NSCollectionView.只需显示原型对象的网格,并将每个对象的标题设置为某个值.
如果我们能够为很多人提供一个如何做到这一点的好例子,我认为这将有助于所有与之合作NSCollectionViews并且和我一样困惑的人.
请求摘要
如果有符合这些要求的示例代码,请提供一个很棒的链接!
将NSCollectionView拖动到视图时,故事板上会出现一个NSCollectionViewItem,它会浮动.
想象一下,我将几个NScollectionView拖到同一个视图中.我将有一堆NSCollectionViewItems.集合视图如何知道哪个NScollectionViewItem属于它?在界面构建器上可以看到两者之间是否存在连接?我在界面构建器上看不到任何内容?我在哪做什么?
编辑:显然这似乎是一个Xcode错误.当您向故事板添加NSCollectionView时,它没有指向NSCollectionViewItem的链接,似乎无法在它们之间连接itemPrototype出口.
在与Apple联系了这样的错误之后,他们的答案是:"这是OS X上Storyboard的一个已知问题.请改用Xibs."
只需向Storyboard添加一个NSCollectionView,代码就不会编译错误:未知的segue关系:Prototype.
这是Swift/XCode6-beta4的已知错误还是我错过了什么?
我已经成功地拖延了我的工作NSCollectionView,但是视觉外观和行为存在一些问题.主要问题是放置区/占位符的大小错误,即它小于集合视图的大小minItemSize.我已经搜索了文档,但看不出任何指定方法.
我的第二个问题是,我希望单元格图像在被拖动时实际移动,而不是仅仅具有半透明副本.
这是当前的行为:

这是我想要的行为(在Sketch中使用):

任何建议将不胜感激.如果任何代码有用,请告诉我 - 我不确定哪些部分与解决这个问题相关.谢谢!
我最近审查了我一年前发布的一个应用程序。而且我看到现在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 完全一样。
至于鼠标选择矩形 - 我没有覆盖任何鼠标事件。不清楚为什么我没有这个功能。
我有NSCollectionView几个NSViews.其中NSView有一个NSBox在选择时改变颜色.我还希望NSBox在悬停时改变颜色.
我继承NSBox并添加了mouseEntered和mouseExited方法.我addTrackingRect在里面使用viewWillMoveToWindow但问题是只有当我第一次选择框所在的子视图时才会发生悬停效果.
此外,只有选中的框会在其上发生悬停效果.如何实现悬停过度效果,使NSView我的所有s NSCollectionView立即显示效果?
适用于OS X v10.11的AppKit发行说明建议可以基于每个项目调整集合视图项目的大小:
可以为所有CollectionView的项目全局确定项目大小(通过设置NSCollectionViewFlowLayout的"itemSize"属性),也可以从一个项目到下一个项目(通过在CollectionView的委托上实现-collectionView:layout:sizeForItemAtIndexPath:)进行更改.
在我的例子中,我的CollectionViewItem包含一个包含不同长度字符串的标签.我正在使用NSCollectionView来显示字符串数组,因为NSStackViews不支持数组绑定,并且不会流向新行.字符串数组通过数组控制器绑定到NSCollectionView的内容.
我的项目的nib文件已正确设置,根视图和标签都具有内容拥抱和内容压缩阻力优先级1000,并且边缘通过AutoLayout对齐.
现在,NSCollectionViewLayout的委托方法具有以下签名:
func collectionView(collectionView: NSCollectionView,
layout collectionViewLayout: NSCollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> NSSize
Run Code Online (Sandbox Code Playgroud)
我现在的想法是抓住项目本身,对其进行布局传递,然后返回新项目大小.
let item = collectionView.itemAtIndexPath(indexPath)!
item.view.layout()
return item.view.bounds.size
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是itemAtIndexPath返回nil.如果我以零值返回默认大小,则默认大小将用于所有单元格.
如何设置NSCollectionView以尊重我的项目的AutoLayout约束,并为每个单元格动态使用计算的大小?
macos cocoa nscollectionview nscollectionviewitem autolayout
我已将菜单绑定到界面构建器中的NSCollectionView.但是当我按住CTRL并单击(右键单击)时,菜单没有显示.
我试过在NSCollectionView子类中添加一些方法.它们都没有被调用:
+ (NSMenu*)defaultMenu
- (NSMenu *)menuForEvent:(NSEvent *)theEvent
- (void)rightMouseDown:(NSEvent *)theEvent
- (void)sendEvent:(NSEvent *)theEvent
Run Code Online (Sandbox Code Playgroud)
唯一被调用的方法是:
- (NSView *)hitTest:(NSPoint)aPoint
Run Code Online (Sandbox Code Playgroud)
这意味着NSCollectionView接收鼠标事件.
我也尝试将相同的方法添加到NSCollectionViewItem的子类中,结果是相同的.只有hitTest:被召唤.
我想构建一个类似于iPhoto '11中的NSCollectionView.我想在部分中分组几个图片,并创建一个部分标题.特定部分的节标题始终可见,直到该节的最后一个元素可见.你可以看看图片,看看我的意思.
编辑:我应该补充说,内容不是图像.

提前致谢
nscollectionview ×10
cocoa ×9
macos ×4
objective-c ×4
xcode ×3
nsview ×2
swift ×2
appkit ×1
autolayout ×1
events ×1
iphoto ×1
storyboard ×1
xcode6 ×1