单击NSTextField时出现NSComboBox

时间:2013-03-06 13:05:20

标签: xcode cocoa nstextfield nscombobox

单击NSTextField时,如何使NSComboBox消失? 这是我正在使用的代码:

类comboBox :(在界面构建器中用作我的NSComboBox的自定义类) comboBox.h:

#import <Cocoa/Cocoa.h>
@interface comboBox1 : NSComboBox
-(void)Hide;
@end

comboBox.m:

#import "comboBox1.h"
@implementation comboBox1
-(void)Hide
{
    [self setHidden:YES];
}
@end

类txtField :(在接口构建器中用作我的NSTextField的自定义类) txtField.h:

#import <Cocoa/Cocoa.h>
@interface txtField1 : NSTextField
@end

txtField.m:

#import "txtField1.h"
#import "comboBox1.h"
@implementation txtField1
-(void)mouseDown:(NSEvent *)theEvent
{
    comboBox1 *obj = [[comboBox1 alloc] init];
    [obj Hide];
}
@end

但它不起作用:单击TextField时没有任何反应。 谢谢你的建议。

2 个答案:

答案 0 :(得分:0)

您可以使用NSTextfield

的委托方法
 - (void)controlTextDidBeginEditing:(NSNotification *)obj;
 - (void)controlTextDidEndEditing:(NSNotification *)obj;
 - (void)controlTextDidChange:(NSNotification *)obj;

更新

Apple提供了NSTrackingAreas.

的文档和示例
- (void) viewWillMoveToWindow:(NSWindow *)newWindow {
    // Setup a new tracking area when the view is added to the window.
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[textfield frame] options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void) mouseEntered:(NSEvent*)theEvent {
    // Mouse entered tracking area.
}

- (void) mouseExited:(NSEvent*)theEvent {
    // Mouse exited tracking area.
}

答案 1 :(得分:0)

您的mouseDown:方法是罪魁祸首。您不必引用NIB中的comboBox1,而是每次都创建一个新的comboBox1实例,并将该新实例告诉“隐藏”。在那里泄漏内存旁边,每次单击NSTextField时,您可能不需要新的comboBox1。

而是使用NSTextField的委托方法来获得你想要的东西。

- (void)controlTextDidBeginEditing:(NSNotification *)obj;
- (void)controlTextDidEndEditing:(NSNotification *)obj;
- (void)controlTextDidChange:(NSNotification *)obj;

因为你正在使用IB我假设你有一个带有txtField1和comboBox1的View-或WindowController。 在ViewController(或WindowController)中,将ViewController设置为NSTextField的委托,并告诉comboBox1隐藏在其中一个委托方法中。

一个例子:

在ViewController.h中,首先声明两个对象:

@property (assign) IBOutlet comboBox1 *comboBox1;
@property (assign) IBOutlet txtField1 *txtField1;

然后在您的实施中:

- (void)controlTextDidBeginEditing:(NSNotification *)obj {
    [comboBox1 hide];
}

不要忘记在Interface Builder中将插座连接到ViewController。还要将txtField1的delegate插座连接到Viewcontroller。