0

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

类组合框:(在界面生成器中用作我的 NSComboBox 的自定义类)comboBox.h:

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

组合框.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 时没有任何反应。谢谢你的建议。

4

2 回答 2

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.
}
于 2013-03-06T14:57:23.310 回答
0

你的mouseDown:方法是这里的罪魁祸首。您每次都创建一个新的 comboBox1 实例并告诉该新实例“隐藏”,而不是在您的 NIB 中引用 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。delegate还将 txtField1的出口连接到您的 Viewcontroller。

于 2013-03-06T15:11:49.930 回答