我有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拖动到视图时,故事板上会出现一个NSCollectionViewItem,它会浮动.
想象一下,我将几个NScollectionView拖到同一个视图中.我将有一堆NSCollectionViewItems.集合视图如何知道哪个NScollectionViewItem属于它?在界面构建器上可以看到两者之间是否存在连接?我在界面构建器上看不到任何内容?我在哪做什么?
编辑:显然这似乎是一个Xcode错误.当您向故事板添加NSCollectionView时,它没有指向NSCollectionViewItem的链接,似乎无法在它们之间连接itemPrototype出口.
在与Apple联系了这样的错误之后,他们的答案是:"这是OS X上Storyboard的一个已知问题.请改用Xibs."
适用于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
没有绑定?
cocoa objective-c cocoa-bindings nscollectionview nscollectionviewitem
我使用新的基于视图的NSTableView为Mac OS X Lion开发了一个应用程序,但是由于我想将整个应用程序移植到Snow Leopard,我试图找出模拟这样一个tableview的最佳方法.到目前为止,我已经创建了一个NSCollectionView,一切都很好,除了我无法获取触发按钮单击事件的视图的索引.在Lion中我有以下功能:
- (IBAction)buttonClick:(id)sender
Run Code Online (Sandbox Code Playgroud)
所以我可以使用一个方法(我记不起它的名字)来得到tableview里面的视图索引
- (NSInteger)rowForView:(NSView *)aView
Run Code Online (Sandbox Code Playgroud)
使用aView作为发件人的超级视图,但我找不到类似于集合视图的东西...唯一"有用"的方法似乎是
- (NSCollectionViewItem *)itemAtIndex:(NSUInteger)index
Run Code Online (Sandbox Code Playgroud)
(或类似的东西),但这不能帮助我,因为它返回一个NSCollectionViewItem,我甚至无法访问它只知道相应的视图!
indexing cocoa nstableview nscollectionview nscollectionviewitem
我正在尝试建立一个NSCollectionView
(我过去成功完成了这个,但由于某种原因,这次失败了).
我有一个名为"TestModel"的模型类,它有一个NSString
只返回一个字符串的属性(仅用于测试目的).然后NSMutableArray
我在我的主app appate类中有一个属性声明,并且我在这个数组中添加了该TestModel
对象的实例.
然后我有一个Array Controller,它的内容数组绑定了app delegate NSMutableArray
.我可以确认到目前为止的一切工作正常; NSLogging:
[[[arrayController arrangedObjects] objectAtIndex:0] teststring]
Run Code Online (Sandbox Code Playgroud)
工作得很好.
然后,我为集合视图设置(itemPrototype和内容)以及集合视图项(视图)提供了所有适当的绑定.然后,我在集合项视图中有一个绑定到Collection View的文本字段Item.representedObject.teststring
.但是,当我启动应用程序时,NOTHING会显示在集合视图中,只是一个空白的白色屏幕.我错过了什么?
更新:这是我使用的代码(由wil shipley请求):
// App delegate class
@interface AppController : NSObject {
NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end
@implementation AppController
@synthesize objectArray;
- (id)init
{
if (self = [super init]) {
objectArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
if …
Run Code Online (Sandbox Code Playgroud) cocoa objective-c nsarraycontroller nscollectionview nscollectionviewitem
当用户双击时,如何设置操作NSCollectionViewItem
。NSTableView
,例如,具有setDoubleAction
方法。有类似的东西NSCollectionView
吗?
谢谢
我在这里有点迷失:我创建了一个像colorPicker一样的按钮:单击它会在弹出框中显示一个collectionView.我首先使用包含视图+ collectionView(嵌入在scrollView + clipView中)的nib fil.东西工作得很好.
由于nib文件非常简单(并且为了提高我在编程方式设计视图时的编码技巧),我决定摆脱nib文件并在代码中编写缺失的部分.问题是,我设法完成工作,除了collectionView的内容.经过深入调查,看来,方法内部:
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem
Run Code Online (Sandbox Code Playgroud)
这应该是管理数据源的方法
collectionView.makeItem(withIdentifier: String, for: IndexPath)
Run Code Online (Sandbox Code Playgroud)
不起作用.事实上,在:
let item = collectionView.makeItem(withIdentifier: ColorPickerPopover.itemIdentifier, for: indexPath)
Run Code Online (Sandbox Code Playgroud)
item是未初始化的,正如调试器在我介入时说的那样(不是零,未初始化).显然,makeItem方法永远不会从我所创建的子类中实例化任何collectionViewItem.标识符很好,并且调用了collectionView.register函数,就像在nib版本中一样,因为这两个项目在这些点上是相同的.makeItem函数根本不调用我已经子类化的NSCollectionViewItem的loadView方法.
任何线索?
玩笑
使用XCode 4.1每当我尝试使用CollectionView时,我都会遇到崩溃.
这些是我正在做的步骤:
这是否会发生在其他人身上,还是只是我遇到过的事情?有没有办法解决它,以允许我绑定到集合视图项(我希望最终绑定到representObject值)在XCode或代码中.
我试图创建一个自定义的NSCollectionViewItem子类,它使用一个单独的nib文件,并将其设置为NSCollectionView的itemPrototype,但事情却非常错误.
任何人都可以建议如何解决这个NSCollectionView
问题?从Swift 3转换为Swift 4并且魔术开始发生:)
码:
let item = NSNib(nibNamed: NSNib.Name(rawValue: "MACollectionViewItem"), bundle: nil)
collectionView.register(item, forItemWithIdentifier: "CollectionViewItem")
Run Code Online (Sandbox Code Playgroud)
第二行错误:
无法
register
使用类型的参数列表调用' ''(NSNib?, forItemWithIdentifier: String)'
如何通过再次单击 NSCollectionViewItem 来取消选择它?
这是我用于选择和取消选择的代码:
func collectionView(collectionView: NSCollectionView, didSelectItemsAtIndexPaths indexPaths: Set<NSIndexPath>) {
print("selected")
guard let indexPath = indexPaths.first else {return}
print("selected 2")
guard let item = collectionView.itemAtIndexPath(indexPath) else {return}
print("selected 3")
(item as! CollectionViewItem).setHighlight(true)
}
func collectionView(collectionView: NSCollectionView, didDeselectItemsAtIndexPaths indexPaths: Set<NSIndexPath>) {
print("deselect")
guard let indexPath = indexPaths.first else {return}
print("deselect 2")
guard let item = collectionView.itemAtIndexPath(indexPath) else {return}
print("deselect 3")
(item as! CollectionViewItem).setHighlight(false)
}
/////////////////////
class CollectionViewItem: NSCollectionViewItem {
func setHighlight(selected: Bool) {
print("high")
view.layer?.borderWidth = selected ? 5.0 : …
Run Code Online (Sandbox Code Playgroud) xcode cocoa flowlayout nscollectionview nscollectionviewitem
我已经阅读了一些问题,但我发现有些问题令人困惑,我不知道他们是否回答了我的问题.
我已NSCollectionView
实现并连接到a Core Data context
,一切都正确显示.
现在我已经是buttons
在view prototype
,当我点击这个按钮,我需要得到的价值representedObject
是克隆的看法.
我有阅读和阅读,有些部分让我感到困惑,所以我正在寻找一个简单的解释.
感谢您的时间.
我有一个 NSCollectionView 显示一堆称为“ImageCollectionViewItem”的项目。我有一个 ImageCollectionViewItem.xib 文件,它只有一个覆盖该项目的 NSView。我希望能够动态更改该视图中的内容,但是当我尝试引用它时,它为零。我已经检查过这样的问题:UIViewController nil in viewdidload 中的 outlet,这不是我的问题,我链接了它,我有实心圆圈
这是视图控制器扩展:
extension ViewController : NSCollectionViewDataSource {
func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
return titles.count
}
func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {
let item = collectionView.makeItemWithIdentifier("ImageCollectionViewItem", forIndexPath: indexPath) as! ImageCollectionViewItem
//This is what is nil:
let thisView = item.iconView
return item
}
}
Run Code Online (Sandbox Code Playgroud)
然后这里是 ImageViewCollectionItem 代码
class ImageCollectionViewItem: NSCollectionViewItem {
@IBOutlet weak var iconView: NSView!
var numItem: Int?
override func viewDidLoad() { …
Run Code Online (Sandbox Code Playgroud) nscollectionview ×13
cocoa ×11
objective-c ×5
macos ×3
swift ×3
autolayout ×1
flowlayout ×1
indexing ×1
nstableview ×1
nsview ×1
swift3 ×1
swift4 ×1
xcode ×1