2013-03-06 57 views
0

如何在单击NSTextField时使NSComboBox消失? 这是我使用的代码:制作NSComboBox当单击NSTextField时出现

类组合框:(在界面生成器作为自定义类我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 

但它不工作:当单击文本字段没有任何反应。 谢谢你的建议。

回答

0

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

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

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

既然你使用IB我假设你有一个视图或WindowController与txtField1和comboBox1。 在您的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的出口连接到您的Viewcontroller。

+0

谢谢你的男人! 现在终于在我的NIB中出现NSComboBox,但出现了一个问题:我希望它在用户单击NSTextField时立即出现。使用您提供的代码,当用户开始编写(编辑)NSTextField的内容时,会出现NSComboBox。 任何解决方案? – rambodrahmani 2013-03-06 15:35:17

+0

还有一个问题,你说: 既然你在使用IB,我假设你有一个带有txtField1和comboBox1的View或WindowController。 我没有这样的事情。 – rambodrahmani 2013-03-06 15:36:21

+0

@rambodrahmani当您单击txtField1时,可以使用不同的选项让NSComboBox显示。最简单的方法是在你已经使用的txtField1的'mouseDown:'方法中。 在txtField1的'delegate'中实现一个新的方法。在那个方法中,和你在' - (void)controlTextDidBeginEditing:(NSNotification *)obj'中做的一样。接下来在txtField1的'mouseDown:'调用'delegate'上的那个方法' – 2013-03-06 15:59:42

0

您可以使用委托方法为NSTextfield

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

更新

苹果提供的文档和示例为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. 
} 
+0

谢谢你的男人!有一个问题:我希望NSComboBox在用户单击NSTextField时立即出现。使用您提供的代码,当用户开始编写(编辑)NSTextField的内容时,会出现NSComboBox。任何解决方案? – rambodrahmani 2013-03-06 15:35:53