2013-03-06 4 views
0

Как я могу удалить NSComboBox при нажатии на NSTextField? Это код, я использую:Сделать NSComboBox Появляется при нажатии на NSTextField

Класс 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 ничего не происходит. Благодарим вас за консультацию.

ответ

0

Ваш метод mouseDown: является виновником здесь. Вместо ссылки на comboBox1 в вашем NIB каждый раз вы создаете новый экземпляр comboBox1 и указываете, что новый экземпляр «скрывается». Рядом с утечкой памяти там, вы, вероятно, не хотите новый comboBox1 каждый раз, когда вы нажимаете NSTextField.

Вместо этого используйте методы делегата 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]; 
} 

Только не забудьте подключить выходы к ваш ViewController в интерфейсе Builder. Также подключите розетку txtField1 delegate к вашему Viewcontroller.

+0

Спасибо, человек! Теперь, наконец, появляется NSComboBox в моем NIB, но есть проблема: я хочу, чтобы он появился, как только пользователь нажимает на NSTextField.Вместо кода, который вы указали, NSComboBox появляется, когда пользователь начинает писать (редактировать) содержимое NSTextField. Любые решения для этого? – rambodrahmani

+0

И еще один вопрос, вы сказали: Поскольку вы используете IB, я предполагаю, что у вас есть View- или WindowController с как txtField1, так и comboBox1. У меня такого нет. – rambodrahmani

+0

@rambodrahmani Существуют различные варианты, позволяющие отображать NSComboBox при нажатии на txtField1. Самый простой из них будет в методе 'mouseDown:' txtField1, который вы уже использовали. Внесите новый метод в 'делегат' txtField1. В этом методе выполните то же самое, что и в '- (void) controlTextDidBeginEditing: (NSNotification *) obj'. Далее в 'mouseDown: txtField1:' вызывается этот метод на 'delegate' –

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. 
} 
+0

Спасибо, человек! есть проблема: я хочу, чтобы NSComboBox появлялся, как только пользователь нажимает на NSTextField. Вместо кода, который вы указали, NSComboBox появляется, когда пользователь начинает писать (редактировать) содержимое NSTextField. Любые решения для этого? – rambodrahmani