Objective c 鼠标事件处理程序
MyNSImageView是NSImageView的一个子类,我有:Objective c 鼠标事件处理程序,objective-c,delegates,target-action,Objective C,Delegates,Target Action,MyNSImageView是NSImageView的一个子类,我有: @interface MyNSImageView : NSImageView { } @end @implementation MyNSImageView //- (void) mouseDown: (NSEvent *) theEvent //{ // do not wish to implement mouseDown event handler from here //} @end 在另一个名为MainVie
@interface MyNSImageView : NSImageView
{
}
@end
@implementation MyNSImageView
//- (void) mouseDown: (NSEvent *) theEvent
//{
// do not wish to implement mouseDown event handler from here
//}
@end
在另一个名为MainView的类中,我有:
@interface MainView : NSView
{
MyNSImageView *ImageView1;
MyNSImageView *ImageView2;
}
@end
- (void)awakeFromNib
{
ImageView1 = [[[MyNSImageView alloc] initWithFrame:NSMakeRect(5, 5, 240, 240)] autorelease];
NSImage* image1 = [[[NSImage alloc] initWithContentsOfFile: @"/Volumes/MAC DAT2/pictures/MP6107.jpg"] autorelease];
[ImageView1 setImage:image1];
[self addSubview:ImageView1];
ImageView2 = [[[MyNSImageView alloc] initWithFrame:NSMakeRect(300, 5, 240, 240)] autorelease];
image1 = [[[NSImage alloc] initWithContentsOfFile: @"/Volumes/MAC DAT2/pictures/MP5784.jpg"] autorelease];
[ImageView2 setImage:image1];
[self addSubview:ImageView2];
}
- (void) mouseDown2: (NSEvent *) theEvent
{
NSLog(@"mousedown2 from MainView");
}
- (void) mouseDown1: (NSEvent *) theEvent
{
NSLog(@"mousedown1 from MainView");
}
@end
- (void) mouseDown: (NSEvent *) theEvent
{
NSLog(@"mousedown from MainView");
}
在MainView中,当我单击ImageView1或ImageView2时,我希望使用mouseDown1或mouseDown2方法来相应地处理事件,而不是mouseDown方法
我已经阅读了有关目标/操作/委托和响应程序的内容,但仍然看不到执行此操作的确切语法。您应该阅读。要调用MyCallingClass的-mouseDown:方法,该类的实例必须位于当前响应程序链中,且链下游的其他响应程序都不应处理该事件。您应该了解。要调用MyCallingClass的-mouseDown:方法,该类的实例必须位于当前响应程序链中,链下游的其他响应程序都不应处理该事件。处理该事件的一种方法是使用委托: 首先,为
NSImageView
子类声明一个委托协议:
@class MyNSImageView;
@protocol MyNSImageViewDelegate <NSObject>
- (void)myImageView:(MyNSImageView *)view mouseDown:(NSEvent *)event;
@end
@interface MyNSImageView : NSImageView {
}
// declare the delegate member
@property (assign) id<MyNSImageViewDelegate> delegate;
@end
@implementation MyNSImageView
@synthesize delegate = _delegate;
// In your mouseDown method, notify the delegate
- (void)mouseDown:(NSEvent *)event {
if([self.delegate respondsToSelector:@selector(myImageView:mouseDown:)]) {
[self.delegate myImageView:self mouseDown:event];
}
}
@end
在您的MainView
实现中:
- (void)awakeFromNib {
// create your image views then add our instance as the delegate to each
ImageView1.delegate = self;
ImageView2.delegate = self;
}
// here we implement the `MyNSImageViewDelegate` method, which will get
// called when any `MyImageNSView` instance we've added ourselves as
// delegate to gets clicked.
- (void)myImageView:(MyNSImageView *)view mouseDown:(NSEvent *)event {
if (view == imageView1) {
NSLog(@"imageView1 clicked");
} else if (view == imageView2) {
NSLog(@"imageView2 clicked");
}
}
处理此问题的一种方法是使用委托: 首先,为
NSImageView
子类声明一个委托协议:
@class MyNSImageView;
@protocol MyNSImageViewDelegate <NSObject>
- (void)myImageView:(MyNSImageView *)view mouseDown:(NSEvent *)event;
@end
@interface MyNSImageView : NSImageView {
}
// declare the delegate member
@property (assign) id<MyNSImageViewDelegate> delegate;
@end
@implementation MyNSImageView
@synthesize delegate = _delegate;
// In your mouseDown method, notify the delegate
- (void)mouseDown:(NSEvent *)event {
if([self.delegate respondsToSelector:@selector(myImageView:mouseDown:)]) {
[self.delegate myImageView:self mouseDown:event];
}
}
@end
在您的MainView
实现中:
- (void)awakeFromNib {
// create your image views then add our instance as the delegate to each
ImageView1.delegate = self;
ImageView2.delegate = self;
}
// here we implement the `MyNSImageViewDelegate` method, which will get
// called when any `MyImageNSView` instance we've added ourselves as
// delegate to gets clicked.
- (void)myImageView:(MyNSImageView *)view mouseDown:(NSEvent *)event {
if (view == imageView1) {
NSLog(@"imageView1 clicked");
} else if (view == imageView2) {
NSLog(@"imageView2 clicked");
}
}
谢谢你的回复。我最初的问题不清楚。我对这个问题作了一些修改。如果mouseDown事件处理程序未在MyNSImageView中实现,则MainView(MyCallingClass)中的mouseDown事件处理程序将接管。但我需要能够从不同的图像中区分mousedown事件。如果您有任何建议,我们将不胜感激。谢谢您的回复。我最初的问题不清楚。我对这个问题作了一些修改。如果mouseDown事件处理程序未在MyNSImageView中实现,则MainView(MyCallingClass)中的mouseDown事件处理程序将接管。但我需要能够从不同的图像中区分mousedown事件。如果您有任何建议,我们将不胜感激。我知道这会涉及选择器和委托的东西。但是不能把所有的联系在一起。干得好如果你熟悉C语言或C++,他们处理这个问题要简单得多。(顺便说一句:您的代码中缺少一行是“@synthesis delegate;”。它需要在MyNSImageView的实现文件中。)只是一个附带问题:我以这种方式处理鼠标事件的实现是否符合MVC模型?感谢您指出缺少的@synthesis。。。很抱歉。请检查我的编辑以获取其他有效方法。。。目标操作机制可能是这里最惯用的Cocoa/MVC方法。NSImageView的setAction与鼠标单击(按钮等)的含义不同,因此,setAction无法实现我试图实现的目标(不同的鼠标事件:鼠标右键、鼠标左键等)我认为您最初的解决方案是一种正确的方法,从技术上讲,它听起来是正确的。
NSImageView
的操作是在用户将图像放到图像视图时发送的,而不是在单击图像时发送的。这样做了。我知道这会涉及选择器和委托的东西。但是不能把所有的联系在一起。干得好如果你熟悉C语言或C++,他们处理这个问题要简单得多。(顺便说一句:您的代码中缺少一行是“@synthesis delegate;”。它需要在MyNSImageView的实现文件中。)只是一个附带问题:我以这种方式处理鼠标事件的实现是否符合MVC模型?感谢您指出缺少的@synthesis。。。很抱歉。请检查我的编辑以获取其他有效方法。。。目标操作机制可能是这里最惯用的Cocoa/MVC方法。NSImageView的setAction与鼠标单击(按钮等)的含义不同,因此,setAction无法实现我试图实现的目标(不同的鼠标事件:鼠标右键、鼠标左键等)我认为您最初的解决方案是一种正确的方法,在技术上听起来也不错。NSImageView
的操作是在用户将图像放到图像视图时发送的,而不是在单击图像视图时发送的。