Objective c 鼠标事件处理程序

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

MyNSImageView是NSImageView的一个子类,我有:

@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
的操作是在用户将图像放到图像视图时发送的,而不是在单击图像视图时发送的。