我在运行时创建了一个按钮和一个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
进行的创建。调用NSImageView
的setImage:
时,它将保留(或复制)传入的图像,因此您需要自动释放该图像,以抵消使用+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/