我在运行时创建了一个按钮和一个NSImageView控件。该按钮响应了单击事件。但是imageview没有。有什么建议么?

    NSView *superview = [((MyAppAppDelegate *)[NSApp delegate]).window contentView];

    NSButton *button = [ [ NSButton alloc ] initWithFrame: NSMakeRect(300, 50, 50.0, 50.0 ) ];
    [superview addSubview:button];
    [button setTarget:self];
    [button setAction:@selector(button_Clicked:)];

    NSImageView *myImageView = [[NSImageView alloc] initWithFrame:NSMakeRect(5, 5, 240, 240)];
    NSString* filePath = @"/Volumes/MAC DAT2/pictures/TVX1/153/MP6107frame5786.jpg";
    NSImage* image1 = [[NSImage alloc] initWithContentsOfFile:filePath];
    [myImageView setImage:image1];
    [superview addSubview:myImageView];
    [myImageView setTarget:self];
    [myImageView setAction:@selector(mouseDown:)];

}
- (IBAction)button_Clicked:(id)sender
{
    NSLog(@"button clicked");
}
-(void) mouseDown:(NSEvent *)event
//- (IBAction)mouseDown:(NSEvent *)event  //also have tried this one.
{
    NSLog(@"mousedown");

}


编辑:我需要使用NSImageView,所以对图像使用NSButton不是解决方案。

最佳答案

首先,您的代码存在几个内存问题:使用alloc/init创建本地对象,然后将这些对象交给保留它们的其他对象时,随后需要使用-release-autorelease这些对象。

NSView *superview = [((MyAppAppDelegate *)[NSApp delegate]).window contentView];

// memory leak averted:
NSButton *button = [[[NSButton alloc] initWithFrame:
                      NSMakeRect(300, 50, 50.0, 50.0 )] autorelease];

[superview addSubview:button];
[button setTarget:self];
[button setAction:@selector(button_Clicked:)];

// memory leak averted:
NSImageView *myImageView = [[[NSImageView alloc] initWithFrame:
                              NSMakeRect(5, 5, 240, 240)] autorelease];

NSString* filePath = @"/Volumes/MAC DAT2/pictures/TVX1/153/MP6107frame5786.jpg";

// memory leak averted:
NSImage* image1 = [[[NSImage alloc] initWithContentsOfFile:filePath] autorelease];

[myImageView setImage:image1];
[superview addSubview:myImageView];
[myImageView setTarget:self];
[myImageView setAction:@selector(mouseDown:)];


NSView-addSubview:将视图插入到视图层次结构中,就像一个子视图数组。结果,-addSubview:保留了传入的视图,因此您需要自动释放它以抵消使用+alloc进行的创建。调用NSImageViewsetImage:时,它将保留(或复制)传入的图像,因此您需要自动释放该图像,以抵消使用+alloc的创建。

默认情况下,NSImageView不会对-mouseDown:做出反应,也不会像其他-mouseUp:子类(即NSControl)那样对NSButton做出反应。如果它在视觉上起作用,则以仅显示图像而不是使用NSButton的方式配置NSImageView可能更有意义,否则您可能需要创建NSImageView的自定义子类。

NSImageView子类中,我将认真考虑是否要重写mouseDown:是正确的选择,还是应该等到收到mouseUp:之后再发送操作。例如,大多数按钮在单击鼠标时不会立即发送其动作;而是在按下鼠标后立即发送动作。相反,它们会等到您放开鼠标(mouseUp:),以防用户想要改变主意。

无论如何,子类如下所示:

@interface MDImageView : NSImageView {

}

@end

@implementation MDImageView

- (void)mouseUp:(NSEvent *)event {
      if ([[self target] respondsToSelector:[self action]]) {
         [NSApp sendAction:[self action] to:[self target] from:self];
      }
}

@end

关于objective-c - 在运行时添加NSImageview不会响应mousedown事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5925571/

10-13 09:06