我创建了nstextfield的子类,并且我覆盖了keydown事件但是我的代码不起作用,然后我覆盖de keyup事件并且代码完美地工作。 我的keydown代码(不起作用):
-(void)keyDown:(NSEvent *)event {
NSLog(@"Key released: %hi", [event keyCode]);
if ([event keyCode]==125){
[[self window] selectKeyViewFollowingView:self];
}
if ([event keyCode]==126){
[[self window] selectKeyViewPrecedingView:self];
}
}
我的密钥代码(可行):
-(void)keyUp:(NSEvent*)event
{if ([event keyCode]==125){
[[self window] selectKeyViewFollowingView:self];
}
if ([event keyCode]==126){
[[self window] selectKeyViewPrecedingView:self];
}
if ([event keyCode]==36){
[[self window] selectKeyViewFollowingView:self];
}
}
我没看到我的keydown代码出现问题。任何建议都将被接受
编辑: 我已经读过你必须继承NSTextView而不是NSTextField。
答案 0 :(得分:9)
您可以在不使用NSTextFieldDelegate方法进行子类化的情况下完成此操作:
正如@Darren Inksetter所说,你可以使用control:textView:doCommandBySelector:
首先,在接口标记中声明NSTextFieldDelegate。 然后实现方法:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
if( commandSelector == @selector(moveUp:) ){
// Do yourthing here, like selectKeyViewFollowingView
return YES; // Return YES means don't pass it along responders chain. Return NO if you still want system's action on this key.
}
if( commandSelector == @selector(moveDown:) ){
// Do the same with the keys you want to track
return YES;
}
return NO;
}
答案 1 :(得分:8)
无法在NSTextField中覆盖keydown事件,如果需要,可以覆盖超级视图的keydown事件,或者可以使用NSTextView或只是覆盖NSTextField中的keyup事件
答案 2 :(得分:3)
您需要查看
control:textView:doCommandBySelector:
答案 3 :(得分:0)
迅速5示例。
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
switch commandSelector {
case #selector(moveUp(_:)):
impl.tableView.doCommand(by: commandSelector)
return true
case #selector(moveDown(_:)):
impl.tableView.doCommand(by: commandSelector)
return true
default: return false
}
}