如何处理从NSCollectionView单击按钮

时间:2013-06-26 17:12:53

标签: objective-c xcode cocoa interface-builder

我的模型绑定了NSCollectionView (OS X,而不是iOS)。每个集合视图项都有一个按钮和一个标签。我正在处理点击操作,我有senderevent参数,但我无法区分一个按钮和其他按钮。大多数其他不处理集合视图的问题都说使用tag属性,但这不会在Interface Builder的绑定选项卡上公开。有一个ArgumentArgument2绑定,但它们似乎与objc代码中的tag属性不对应,我不知道如何以其他方式访问这些参数。

-(void)image_click:(id)sender forEvent:(NSEvent *)event
{
    NSButton *btn = sender;
    NSLog(@"image clicked, %ld", (long)btn.tag);   //image clicked, 0
}

如何在集合视图中的一组按钮的单击操作中区分Objective-C代码中的按钮?

5 个答案:

答案 0 :(得分:2)

在项目中添加名为MyModel的模型,并在其中声明属性uniqueID MyModel.h

@interface MyModel:NSObject  
@property (retain) NSString* unqiueID;  
@end  

MyModel.m

@implementation MyModel  
@synthesize uniqueID=_uniqueID;
@end

在AppDelegate.m中创建一些模型对象并将它们添加到数组

在IB中添加一个ArrayController并将其绑定到AppDelegate中的数组声明

在IB中选择CollectionView并将其Content属性绑定到ArrayController并将其ControllerKey属性设置为arrangeObjects

在模板视图中使用NSButton的Target和Argument绑定向指定的选择器发送唯一参数

您的参数绑定应如下所示 绑定到:控制器查看项目
模型关键路径:representObject.uniqueID
选择器名称:buttonClicked:

和目标绑定
绑定到:App代表
模型关键路径:自我 选择器名称:buttonClicked:

以下教程中详细说明了这些步骤 https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CollectionViews/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009030
希望这有帮助

答案 1 :(得分:2)

我假设您要确定视图中按钮所代表的模型对象。我能够通过循环集合视图中的按钮来确定模型对象。我无法使用选择索引或任何其他类似属性,但最终可以确定模型。

假设您的NSArrayController已有您的阵列,请执行以下操作:

<强>绑定:

集合视图只需要一个绑定

Bind to:         <NSArrayController instance>
Controller Key:  arrangedObjects
Model Key Path:  <blank>

<强>控制器:

您应该将控制器连接到内容视图

property (weak) IBOutlet NSCollectionView *collectionView;

最后,接收按钮点击消息的控制器应实现此IBAction:

- (IBAction) collectionViewClick:(id)sender
{  
  id objectInClickedView = nil;

  for( int i = 0; i < [[self.collectionView content] count]; i++ ) {
    NSCollectionViewItem *viewItem = [self.collectionView itemAtIndex:i];

    if( [sender isDescendantOf:[viewItem view]] ) {
      objectInClickedView = [[self.collectionView content] objectAtIndex:i];
    }
  }
}

将对象分配给objectInClickedView。如果您真的对view或viewItem感兴趣,可以修改代码。

答案 2 :(得分:1)

我会这样做(因为你要按的按钮应该与相应的模型耦合,因此代表的对象):

  1. 将方法添加到collectionViewItem的模型(例如buttonClicked)
  2. 将按钮目标绑定到集合查看项
  3. 将set model key path绑定到:representObject
  4. 将set selectorname绑定到:您之前选择的methodname(例如buttonClicked)
  5. 如果必须告知代理
  6. ,请将协议添加到模型中

答案 3 :(得分:0)

根据这个“//图像点击,0”我认为每次点击按钮都会得到0,我是否正确?

如果是这样,你可以在collectioViewItem中找到一个按钮的插座并覆盖 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 设置/增加按钮的每个实例的标记。

答案 4 :(得分:-1)

在cellForItemAtIndexPath方法中使用它

   [[cell myButton] addTarget:self action:@selector(myClickEvent:event:) forControlEvents:UIControlEventTouchUpInside];


   -(IBAction)myClickEvent:(id)sender event:(id)event {

          NSSet *touches = [event allTouches];

          UITouch *touch = [touches anyObject];

          CGPoint currentTouchPosition = [touch locationInView:_myCollectionArray];

          NSIndexPath *indexPath = [_myCollectionArray indexPathForItemAtPoint: currentTouchPosition];

   }