2013-03-06 58 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