0

私は、これが 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 チェーンの問題ですか? では、なぜテキスト入力が機能するのでしょうか?

4

1 に答える 1

0

したがって、これらの問題の原因が何かはわかりませんが、これが私が行った回避策です。

コマンド (セレクター) を NSTextView に送信する NSTextField のサブクラスを作成しました。NSTextField には 1 つのサブビューがあり、そのサブビューには、実際には 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];
}

最も洗練されたソリューションではないかもしれませんが、うまくいきます (そもそも何が問題だったのかを理解するまでは)。

于 2013-07-19T07:12:52.267 に答える