Objective c 当另一个NSTextField获得焦点时,应显示NSTextField
我有一个NSTextField,它是从NSTextField子类化的,我希望在我的TextField获得焦点时显示一个新的NSTextField。我更改了becomeFirstResponder的方法,该方法同样有效,因为它在日志区域打印“TextField get focus” 但是外观/消失对我的第二个文本字段不起作用。它也连接在IB中 代码如下:Objective c 当另一个NSTextField获得焦点时,应显示NSTextField,objective-c,macos,cocoa,delegates,nstextfield,Objective C,Macos,Cocoa,Delegates,Nstextfield,我有一个NSTextField,它是从NSTextField子类化的,我希望在我的TextField获得焦点时显示一个新的NSTextField。我更改了becomeFirstResponder的方法,该方法同样有效,因为它在日志区域打印“TextField get focus” 但是外观/消失对我的第二个文本字段不起作用。它也连接在IB中 代码如下: @interface MyNewTextField : NSTextField{ IBOutlet NSTextField* TestText
@interface MyNewTextField : NSTextField{
IBOutlet NSTextField* TestTextFiel;
}
MyNewTextField.m:
#import "SollkontoFeld.h"
@implementation SollkontoFeld
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
}
-(BOOL)becomeFirstResponder{
[testTextFiel setHidden:NO];
NSLog(@"TextField got focus");
return YES;
}
@end
这些方法显然是正确执行的,因为文本是打印出来的。我假设我的外观/消失代码是错误的。首先,您应该验证第二个文本字段是否位于正确的位置,是否具有正确的布局约束等,方法是让它在nib中以可见的形式开始。调用
setHidden:YES
将其隐藏在方便的地方,如awakeFromNib
,使其最初不可见;但是,您可以只注释掉setHidden:调用,使其在启动时可见。我最初的怀疑是,setHidden:NO
调用工作正常,但textfield由于其他原因不可见
除此之外,您只需检查所有连接是否良好,对象是否保留,等等。我注意到您发布的代码声明了一个名为
TestTextFiel
的出口,但随后在TestTextFiel
上调用setHidden:
,这与案例不同。您可以在becomeFirstResponder
方法中添加testTextFiel
的NSLog
,以验证它是否存在;如果有,您可以NSLog
itssuperview
;等等,调试。做些侦探工作找出问题所在。调用setHidden:NO
后,文本字段应该存在,具有正确的超级视图,具有感官框架,将NO
返回到-hidden
,等等。;您可以在调试器中验证这些内容。如果它仍然无法绘制,也许您需要调用setNeedsDisplay:
,尽管我认为这不必要。无论如何,我们在stackoverflow上不可能为您进行调试工作;这是您需要学习的编程基本技能。:-> 多谢各位。这真的很有趣:我写了一个带按钮的小方法来隐藏它。隐藏起作用,而不是出现。这里是:-(iAction)隐藏:(id)发送方{[testTextField setHidden:YES];}
与显示相同:-(iAction)显示:(id)发送方{[testTextField setHidden:NO];}
。这两种方法都有效,但不适用于成为第一响应者。嗯,我不知道为什么会这样。对于这种情况,通常的解决方法是调用像setHidden:
这样的方法,因为时间安排不好,所以不能做你想做的事情,而是将其作为延迟执行来调用。因此,请使用object:nil afterDelay:0.0尝试[testTextFiel performSelector:@selector(setHidden:)
并查看这是否有帮助。setHidden:
方法接受一个BOOL
,不是一个对象,但是传递nil
应该被解释为传递一个NO
值,我认为,因为两者都用零表示;但是,如果这对您来说太老套了,请自己调用一个方法,然后调用setHidden:
.Hmm…它仍然不起作用。也许你可以直接看看我的项目?我把它贴在GitHub上了。这里是链接:在您的成为第一响应者方法中,我添加了NSLog(@“TextField1:%@”,TextField1)代码>,正如我上面建议的,您应该检查ivar是否正确设置;打印的TextField1
为零。检查笔尖时,您似乎有两个对象,都名为“我的文本字段”。可见的一个与TextField1插座没有连接。不可见的一个(只是nib中的一个空闲对象)连接到其TextField1出口,但由于它不可见,这并不重要。因此,您需要删除额外的文本字段并修复nib连接。谢谢;)现在可以显示了,但我还想在焦点丢失时使NSTextField消失。因此我编写了方法-(BOOL)resignFirstResponder{NSLog(@“focus get lost”);[TextField1 setHidden:YES];return YES;}
。根据调试器区域,两个方法同时执行。为什么会这样?我如何避免这种情况并正确编码?