2014-02-16 60 views
2

我试图搭配一个带有标签界面的基本应用程序,它已经过了几年,因为我已经做了任何可可开发,所以我生锈了......我的应用程序将使用选项卡,并在加载选项卡时显示项目的默认视图,允许您单击其中一个项目以在该项目的视图中进行交换(想想Chrome,当您打开新选项卡并显示您最喜欢的网站时你可以点击打开)。从点击NSCollectionVIew获取模型项目

目前我已经为这个几乎完全在界面生成器中实现了一个基本的单窗口UI。一个带有NSCollectionView的窗口,在窗口控制器中使用与ArrayController和NSMutableArray集合项的绑定。很棒。

有两件事,但是我不确定,这让我想知道如果我在这里以编程方式做事情更好,而不是与Interface Builder混淆。特别是两件事情我不知道该怎么做:

  1. 获取点击NSCollectionView事件和其映射到模型中的点击项目表示。在新标签页此集合鉴于
  2. 加载新实例(用户可以打开多个标签页所有这一切应显示项目的网格)

#1我真的没有看到一个伟大的方式做这个。我可以在窗口控制器中捕获mouseDown,但我不知道如何将其映射回模型。我也为我的收藏查看项目创建了一个NSView子类,但是我无法找出将该视图映射到模型的方法...

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

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

回答

2

NSCollectionViewItemNSViewController的子类,您可以在其中设置/获取representedObject。我总是用它来访问底层对象。 ⑵你绝对想分割你的XIB。每当我完成它,我发现它使我的工作变得更容易。

+0

目前集合视图结合它的内容被绑定到一个NSMutableArray窗口控制器的阵列控制器。我想我没弄清楚的部分是,如何从点击中获取NSCollectionViewItem?我可以在窗口控制器或在CollectionItemView中使用的实际视图的子类中捕获mouseDown事件,但是如何将其映射到CollectionViewItem或模型我不知道... – Chad

+0

我想子类NSCollectionView,因为它没有捕捉点击的原生概念。 –

2

为了别人的利益,我最终做了这件事......虽然我怀疑它可能不太理想,

我创建了一个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]; 
}