2012-04-03 19 views
2

NSMenuItemkeyEquivalentNSStringに基づいて設定できるようにしたいと考えました。 :CMD + RALT + SHIFT + D、このためなどNSMenuItemでkeyEquivalentを使用する奇妙な動作

は、私は、次のようにNSStringカテゴリ方法を作成した(デバッグNSLog Sが含まれる):

- (NSDictionary*)toKeyEquivalent 
{ 
    NSMutableDictionary* result = [NSMutableDictionary dictionary]; 

    NSArray* parts = [self componentsSeparatedByString:@"+"]; 

    NSLog(@"parts :%@",parts); 

    if ([[parts objectAtIndex:0] isEqualToString:@""]) 
    { 
     return [NSDictionary dictionaryWithObjectsAndKeys:@"",@"key",[NSNumber numberWithInt:0],@"mask", nil]; 
    } 
    else 
    { 
     [result setValue:[parts lastObject] forKey:@"key"]; 

     int mask = 0; 

     for (NSString* p in parts) 
     { 
      if ([p isEqualToString:@"CMD"]) 
      { 
       NSLog(@"cmd"); 
       mask |= NSCommandKeyMask; 
      } 
      else if ([p isEqualToString:@"SHIFT"]) 
      { 
       NSLog(@"shift"); 
       mask |= NSShiftKeyMask; 
      } 
      else if ([p isEqualToString:@"CTRL"]) 
      { 
       NSLog(@"ctrl"); 
       mask |= NSControlKeyMask; 
      } 
      else if ([p isEqualToString:@"ALT"]) 
      { 
       NSLog(@"alt"); 
       mask = NSAlternateKeyMask; 
      } 
     } 

     [result setValue:[NSNumber numberWithInt:mask] forKey:@"mask"]; 

     return result; 
    } 
} 

ここでは、CMD + を使用してテストしています。

のNSLog出力は次のとおり

2012-04-03 10:36:19.051アプリ[4654:903]の部分:( CMD、 R)

2012-04-03 10 :36:19.052 App [4654:903] cmd

2012-04-03 10:36:19.052 App [4654:903] keyEq:{ key = R; マスク= 1048576; } - 実行の場合

mask=10485761<<20を意味し、これはNSCommandKeyMaskに等しい。言い換えれば

、それがキーと同等かのように思える(コマンド - R)正しく解釈されてきました。

奇妙なことは、しかし、メニュー項目が最終的に表示されたときに、キーと同等の次はあるように見えるということです.... " - - SHIFTコマンドR":-S

なぜですか?何か案は?

答えて

5

rまたはRに合格しましたか?大文字の文字列を渡すと、自動的にシフト要件が追加されます。

+0

聖なる牛を...どうもありがとう!私の信じられないほどばかげた;そのような効果があったかもしれないと想像することもできませんでした...あなたは私をずっと救ってくれました! :-) –

3

大文字をsetKeyEquivalent:に渡すような音です。 The docsは、これは言っている:

ディスカッション
この方法は、それが追加Shiftキーを持っているかどうかを判断するために渡された文字の場合を考えます。つまり、[item setKeyEquivalent:@"w"]はCommand-wと同等のキーを設定し、[item setKeyEquivalent:@"W"]はCommand-Shift-wを設定します。

"SHIFT"がない場合は、入力した文字列をもう少し処理して、小文字にする必要があります。

また、あなたの受け入れられた入力においてよりリベラルなものであることも考慮する必要があります。入力が "Shift"または "shift"であれば、このコードは機能しません。

私はまた、あなたがバグ/タイプミスがあることを考える:「Altキー」キーブランチでmaskにあなたの割り当ては、または欠落しているようだ:

mask = NSAlternateKeyMask; 
// should be mask |= NSAlternateKeyMask; 
+0

ありがとう! :-) –

+0

もっと...私が入力した "リベラル"は、基本的に私が作成した 'plist'からの入力を得ているので、本当に必要なわけではありません。しかし、NSAlternateKeyMaskの良い点は、実際にはタイプミスでした(ああ...どれくらい慎重であっても避けられない...);-) –

+0

ああ、申し訳ありませんが、ユーザーからの文字列。 –