NSTextField箭头键不会移动插入符号

时间:2013-07-08 13:09:42

标签: objective-c cocoa nstextfield

我有点期望这是NSTextField自动响应带有插入符号移动的左/右箭头键的默认行为。不幸的是,在我的应用程序中,这不会发生。是否可以选择打开该行为,或者我是否必须自行添加?

为了进一步说明,接口是动态生成的。我有视图(包含NSTextFields的xib)和我在其他视图上堆叠(手动)的视图控制器。创建视图(即其控制器(newView))时,我使用此代码将其添加到我的NSBox的contentView(boxContent):

[boxContent addSubview:[newView view]];
[newView setWithLabel:attributeLabel forProperty:attribute];
newViewY -= [[newView view] frame].size.height;
[[newView view] setFrameOrigin:NSMakePoint(0, newViewY)];
newViewY -=padding;

奇怪的是文本输入和退格键工作,而其他键(箭头,删除)则没有。

这可能是NSResponder链的问题吗?为什么文本输入会起作用呢?

1 个答案:

答案 0 :(得分:0)

所以,我不知道这些问题的原因是什么,但这是我提出的迂回解决方案。

我创建了一个NSTextField的子类,它将命令(选择器)发送到它的NSTextView。 NSTextField有一个子视图,该子视图还有另一个子视图,实际上是NSTextView:

NSTextView* textView = nil;    
NSArray* subs = [self subviews];
if( subs && [subs count] > 0 ){
    NSView* firstView = [subs objectAtIndex:0];
    NSArray* firstSubs = [firstView subviews];
    if (firstSubs && [firstSubs count] > 0) {       
        textView = [firstSubs objectAtIndex:0];
    }
}

当我初始化那个(如果有人知道比这个子视图搜索更好的方法,请告诉),我发送它应该得到的命令:

-(void)keyUp:(NSEvent *)theEvent{   
   BOOL isShift = (theEvent.modifierFlags & NSShiftKeyMask) > 0;
   BOOL isCommand = (theEvent.modifierFlags & NSCommandKeyMask ) > 0;
   switch (theEvent.keyCode) {
      case 7: if( isCommand && !isShift ) [self notifyTextView:@selector(cut:)]; break;
      case 8: if( isCommand && !isShift ) [self notifyTextView:@selector(copy:)]; break;
      case 9: if( isCommand && !isShift ) [self notifyTextView:@selector(paste:)]; break;
      case 123: [self notifyTextView:isShift ? @selector(moveLeftAndModifySelection:) : @selector(moveLeft:)];break;
      case 124: [self notifyTextView:isShift ? @selector(moveRightAndModifySelection:) :@selector(moveRight:)];break;
      case 117: [self notifyTextView:@selector(deleteForward:)];break;
      default: break;
   }
   [super keyUp:theEvent];
}

可能不是最优雅的解决方案,但它有效(直到我弄清楚首​​先出了什么问题)。