Jav*_*rán 6 cocoa objective-c nstextfield
我创建了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];
}
}
Run Code Online (Sandbox Code Playgroud)
我的密钥代码(它的工作原理):
-(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];
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到我的keydown代码出现问题.任何建议都将被接受
编辑:我已经读过你必须继承NSTextView而不是NSTextField.
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
无法在NSTextField中覆盖keydown事件,如果需要,可以覆盖超级视图的keydown事件,或者可以使用NSTextView或只是覆盖NSTextField中的keyup事件
斯威夫特 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
}
}
Run Code Online (Sandbox Code Playgroud)