6

我有一个NSCollectionView (OS X,不是 iOS)绑定到我的模型。每个集合视图项都有一个按钮和一个标签。我正在处理点击动作,我有senderandevent参数,但我无法区分一个按钮和其他按钮。大多数其他不涉及 Collection Views 的问题都说要使用该tag属性,但这并未在 Interface Builder 的绑定选项卡上公开。有一个ArgumentArgument2绑定,但它们似乎与tagobjc 代码中的属性不对应,我不知道如何访问这些参数。

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

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

4

5 回答 5

2

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

假设您NSArrayController已经拥有数组,请执行以下操作:

绑定:

Collection View 只需要一个绑定

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. 如果您真的对视图或 viewItem 感兴趣,您可以修改代码。

于 2013-07-03T06:35:02.310 回答
2

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

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

我的模型.m

@implementation MyModel  
@synthesize uniqueID=_uniqueID;
@end

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

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

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

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

您的 Arguments 绑定应如下所示
绑定到:控制器视图项
模型键路径:representedObject.uniqueID
选择器名称:buttonClicked:

和目标绑定
绑定到:App Delegate
模型键路径:self
选择器名称:buttonClicked:

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

于 2013-06-27T04:20:17.277 回答
1

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

  1. 为您的 collectionViewItem 的模型添加一个方法(例如 buttonClicked)
  2. 将按钮目标绑定到集合视图项
  3. 绑定设置模型键路径到:representedObject
  4. 将设置选择器名称绑定到:您之前选择的方法名称(例如 buttonClicked)
  5. 如果您必须告诉委托,请将协议添加到您的模型
于 2013-08-28T01:24:06.880 回答
0

根据这个“//image clicked, 0”,我认为每次点击按钮都会得到 0,对吗?

如果是这样,您可以在 collectioViewItem 中有一个按钮的出口并覆盖 -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 以设置/增加按钮的每个实例的标签。

于 2013-07-02T05:45:05.980 回答
-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];

   }
于 2013-07-02T11:41:03.917 回答