我有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