我的模型绑定了NSCollectionView
(OS X,而不是iOS)。每个集合视图项都有一个按钮和一个标签。我正在处理点击操作,我有sender
和event
参数,但我无法区分一个按钮和其他按钮。大多数其他不处理集合视图的问题都说使用tag
属性,但这不会在Interface Builder的绑定选项卡上公开。有一个Argument
和Argument2
绑定,但它们似乎与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代码中的按钮?
答案 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)
我会这样做(因为你要按的按钮应该与相应的模型耦合,因此代表的对象):
答案 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];
}