2017-01-18 5 views
2

キーコマンドが登録されている場合、ユーザーがキーを長押ししすぎると、アクションが何度も呼び出されることがあります。 ⌘Nのように何度も新しいビューを繰り返し開くことができます。ブール型の "既にトリガされた"フラグのようなものに頼らなくても、この動作を止める簡単な方法はありますか?ここでUIKeyCommandの繰り返しアクションを停止

は、私は2つの異なるキーコマンドを登録する方法は次のとおりです。

#pragma mark - KeyCommands 

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

- (NSArray<UIKeyCommand *>*)keyCommands { 
    return @[ 
      [UIKeyCommand keyCommandWithInput:@"O" modifierFlags:UIKeyModifierCommand action:@selector(keyboardShowOtherView:) discoverabilityTitle:@"Show Other View"], 
      [UIKeyCommand keyCommandWithInput:@"S" modifierFlags:UIKeyModifierCommand action:@selector(keyboardPlaySound:) discoverabilityTitle:@"Play Sound"], 
      ]; 
} 

- (void)keyboardShowOtherView:(UIKeyCommand *)sender { 
    NSLog(@"keyboardShowOtherView"); 
    [self performSegueWithIdentifier:@"showOtherView" sender:nil]; 
} 

- (void)keyboardPlaySound:(UIKeyCommand *)sender { 
    NSLog(@"keyboardPlaySound"); 
    [self playSound:sender]; 
} 

#pragma mark - Actions 

- (IBAction)playSound:(id)sender { 
    AudioServicesPlaySystemSound(1006); // Not allowed in the AppStore 
} 

サンプルプロジェクトは、こちらからダウンロードすることができます。一般的にはTestKeyCommands.zip

答えて

2

、新しいビュー以来、これに対処する必要はありません。通常はfirstReponderになり、それは繰り返しを止めるでしょう。 playSoundの場合、ユーザーは何が起こっているのかを知り、キーから指を離します。

つまり、特定のキーを繰り返すべきではない実際のケースがあります。 Appleが公開APIを提供してくれればいいだろう。私が知る限り、彼らはそうではありません。

あなたのコードに「// AppStoreで許可されていない」コメントがある場合、プライベートAPIを使用しても問題ないようです。その場合、keyCommandの繰り返しを無効にすることができます。

UIKeyCommand *keyCommand = [UIKeyCommand ...]; 
[keyCommand setValue:@(NO) forKey:@"_repeatable"]; 
+0

これは公開APIの一部ではありません。助けてくれてありがとう! – Brent

関連する問題