NSTableViewで、シングル/ダブルクリックそれぞれで別の処理を行わせたいのですが、
ダブルクリック時にシングルクリックの処理も呼ばれてしまいます。
シングルクリックの単体の処理、ダブルクリックの単体の処理が行えるように、
ダブルクリック時にシングルクリックが呼ばれないようにする方法は、あるでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/31 07:25
回答1件
0
ベストアンサー
シングルクリックでのアクションをダブルクリックの時にキャンセルさせるためには、
ダブルクリックではないと確定するまでは、シングルクリックのアクションを発動できません。
つまり、クリックした瞬間には何も起きないためUXは悪いと言えます。
その点は注意してください。
使用言語が書いてなかったのでObjective-Cで書きます。
objc
1// シングルクリック時のアクションをキャンセル 2- (void)cancelSingleAction { 3 [[self class] cancelPreviousPerformRequestsWithTarget:self]; 4} 5 6// シングルクリック時のアクション 7- (void)singleAction:(id)sender { 8 NSLog(@"Single"); 9} 10 11// NSTableView.actionに設定するアクション 12- (IBAction)singleClick:(id)sender { 13 [self cancelSingleAction]; 14 [self performSelector:@selector(singleAction:) 15 withObject:sender 16 afterDelay:NSEvent.doubleClickInterval]; 17} 18 19// ダブルクリック時のアクション 20- (IBAction)doubleClick:(id)sender { 21 [self cancelSingleAction]; 22 23 NSLog(@"Double"); 24}
swift
1 // シングルクリック時のアクションをキャンセル 2 func cancelSingleAction() { 3 type(of: self).cancelPreviousPerformRequests(withTarget: self) 4 } 5 6 // シングルクリック時のアクション 7 func singleAction(_ sender: Any?) { 8 print("Single") 9 } 10 11 // NSTableView.actionに設定するアクション 12 @IBAction func singleClick(_ sender: Any?) { 13 cancelSingleAction() 14 perform(#selector(singleAction(_:)), 15 with: sender, 16 afterDelay: NSEvent.doubleClickInterval()) 17 } 18 19 // ダブルクリック時のアクション 20 @IBAction func doubleClick(_ sender: Any?) { 21 cancelSingleAction() 22 23 print("Double") 24 }
簡単に説明すると
- NSEvent.doubleClickIntervalが過ぎるまでシングルクリック時のアクションを遅延させる
- ダブルクリックされたら遅延中のアクションをキャンセルしダブルクリックのアクションを行う
- アクションの遅延中に別のセルがクリックされたら遅延中のアクションをキャンセルし、新たにアクションを遅延させる
cancelPreviousPerformRequests(withTarget:)
はそのクラスのインスタンスが実行したperform(_:, with:, afterDelay:)
の実行のみをキャンセルします。
投稿2017/05/31 11:28
編集2017/06/01 11:25総合スコア3384
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/01 02:11
2017/06/01 05:42 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。