我有一个NSCollectionView,视图是一个带有标签和NSButton的NSBox。我想双击或单击NSButton告诉控制器使用NSCollectionViewItem的表示对象执行操作。 Item View已经被子类化,代码如下:
#import <Cocoa/Cocoa.h>
#import "WizardItem.h"
@interface WizardItemView : NSBox {
id delegate;
IBOutlet NSCollectionViewItem * viewItem;
WizardItem * wizardItem;
}
@property(readwrite,retain) WizardItem * wizardItem;
@property(readwrite,retain) id delegate;
-(IBAction)start:(id)sender;
@end
#import "WizardItemView.h"
@implementation WizardItemView
@synthesize wizardItem, delegate;
-(void)awakeFromNib {
[self bind:@"wizardItem" toObject:viewItem withKeyPath:@"representedObject" options:nil];
}
-(void)mouseDown:(NSEvent *)event {
[super mouseDown:event];
if([event clickCount] > 1) {
[delegate performAction:[wizardItem action]];
}
}
-(IBAction)start:(id)sender {
[delegate performAction:[wizardItem action]];
}
@end
我遇到的问题是,作为一个IBAction,-start范围内唯一的东西是已经绑定在IB中的东西,所以delegate和viewItem。这意味着我无法获取所代表的对象以将其发送给委托。
是否有办法解决这个有限的范围或更好的方法或掌握所代表的对象?
感谢。
答案 0 :(得分:0)
首先,您几乎不需要继承视图。
Bind没有按你的想法做 - 你想要addObserver:forKeyPath:options:context :(你应该试着去了解-bind是什么)。
当你说“关键似乎是NSCollectionViewItem的”原型“视图时”我觉得你真的很困惑......
忘记IBOutlet&amp; IBAction - 如果您不是Interface Builder,它们并不意味着什么。 “原型”在Objective-c中没有任何意义。
视图中的两个方法没有任何不同的范围 - 它们之间没有任何区别。它们都是方法,除了它们的名称(当然还包含它们包含的代码)之外的各种方式都相同。
如果在-start中wizardItem为null但在-mouseDown中具有值,则这与它们被调用的时间完全相关。你要么有一个太快离开的对象,要么就是你认为它没有创建的对象。
你熟悉NSZombie吗?你会发现它非常有用。