我有点期望这是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链的问题吗?为什么文本输入会起作用呢?
答案 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];
}
可能不是最优雅的解决方案,但它有效(直到我弄清楚首先出了什么问题)。