从点击NSCollectionVIew项目获取模型

时间:2014-02-16 00:57:48

标签: objective-c cocoa cocoa-bindings

我正试图建立一个带有标签界面的基本应用程序,自从我完成任何可可开发已经有几年了,所以我生锈了...我的应用程序将使用标签,并显示默认值加载标签时的项目视图,允许您单击其中一个项目以在该项目的视图中交换(想想镀铬,当您打开新标签并显示您可以点击打开的最喜欢的网站时) 。

目前,我已经在界面构建器中实现了基本的单窗口UI。一个带有NSCollectionView的窗口,在我的窗口控制器中使用与ArrayController和NSMutableArray集合项的绑定。效果很好。

有两件事,但是,我不确定,这让我想知道我是不是更好地在这里以编程方式做事而不是搞乱Interface Builder。具体来说,这两件事我不知道该怎么做:

  1. 在NSCollectionView上获取点击事件,并将其映射到所单击项目所代表的模型。
  2. 在新标签中加载此集合视图的新实例(用户可以打开多个标签,所有标签都应显示项目网格)
  3. 对于#1我真的没有看到很好的方法来做到这一点。我可以在窗口控制器中捕获mouseDown,但我不知道如何将其映射回模型。我还为我的集合视图项创建了一个NSView子类,但是我无法找到将该视图映射到模型的方法......

    对于#2,除了以编程方式创建视图之外,我认为没有很好的方法可以做到这一点。我唯一的另一个想法是将视图放在另一个.xib中,并在需要时使用它来创建新视图。如果我能弄清楚#1 ......那么这可能会正常工作。

    所以,我最好只是以编程方式创建集合视图,还是我可以在这里做些什么?

2 个答案:

答案 0 :(得分:3)

为了别人的缘故,这就是我最终做的事情......虽然我怀疑这可能并不理想,但这有效。

我创建了一个ItemView,它是NSView的子类,并将我的Collection View Item的类设置为。然后在那堂课中我做了以下几点:

- (void) mouseDown: (NSEvent *) theEvent
{
    NSCollectionView *myCollectionView = (NSCollectionView *)[self superview];
    NSInteger index = [[myCollectionView subviews]  indexOfObject:self];
    Room *room = [[myCollectionView content] objectAtIndex:index];
    AppDelegate *appD = (AppDelegate *)[[NSApplication sharedApplication]delegate];
    [appD.windowController loadRoom: room];
}

答案 1 :(得分:2)

NSCollectionViewItemNSViewController的子类,您可以在其上设置/获取representedObject。我总是使用它来访问底层对象。

⑵你绝对想要拆分你的XIB。每次我完成它,我发现它使我的工作变得更容易。