2016-10-01 1 views
1

UITableViewCellはマルチタッチのみを検出することができますか?私が1本の指でタップすると、didSelectRowAtIndexは呼び出されません。didSelectRowAtはマルチタッチでのみ呼び出されます

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "bookingSettingsCell", for: indexPath) as! SettingsTableViewCell 
    if indexPath.row < 3 { 
     cell.settingSwitch.removeFromSuperview() 
    } 
    cell.settingTitle.text = dataForSetting[indexPath.row].first 
    if dataForSetting[indexPath.row].last != "Pencil" { 
     cell.settingValue.isHidden = true 
     cell.settingChangable.isHidden = true 
     cell.settingSwitch.isHidden = false 
    } 
    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    DispatchQueue.main.async(execute: { 
     if indexPath.row < 3 { 
      let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "DatePicker") as! DatePickerViewController 
      destinationVC.modalPresentationStyle = .overCurrentContext 
      destinationVC.delegate = self 
      self.present(destinationVC, animated: true, completion: nil) 
     } 
    }) 
} 

のUITableViewCellクラス:ここ

は私のコードです...私は問題はdidSelectRowAtではなく、UITableViewCellのではないと思われる

class SettingsTableViewCell: UITableViewCell { 
@IBOutlet var settingTitle: UILabel! 
@IBOutlet var settingChangable: UIImageView! 
@IBOutlet var settingValue: UILabel! 
@IBOutlet var settingSwitch: UISwitch! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     settingSwitch.transform = CGAffineTransform(scaleX: 0.65, y: 0.60) 
    } 
} 
+0

DispatchQueue.main.asyncの内部にコードを挿入する理由は何ですか? これを取り外して試してみてください。 –

+0

VCを提示する前に長い時間がかかっていない場合(私はこのソリューションが長い間前に見つかった)、実際の問題ではないことを100%確信しています。 – JuicyFruit

+0

私の場合、同じコードが正常に動作しています –

答えて

2

ジェスチャーレコグナイザーのデリゲートメソッドを実装した後に、uitableviews'sdidSelectRowAtメソッドの動作を処理できます。これにより、タップの未定義の振る舞いがuiviewtableViewCellの間にあるのを防ぎ、タッチの記録を保持します。

UIGestureRecognizerDelegate方法:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
    println("in shouldReceiveTouch") 
    gestureRecognizer.delegate = self 
    if (touch.view == tableView){ 
     println("touching tableView list") 
     return false 
    } 
    else{ 
     println("touching elsewhere") 
     return true 
    } 
} 
0

あなたが使用していますxibを設計するときの制約ロジック 一部のオブジェクト(labelまたはimageView)がタッチで問題を発生させる可能性があります。 あなたの制約を確認してください.styleboardのuitableViewで直接tableViewCellをデザインしてください。

+0

私はストーリーボードでそれを設計しました。問題は、私が知っている限り、それはタッチを検出する(すべて良い)か、検出しない(いくつかのビューオーバーレイなど)ことがあるが、それは奇妙なマルチタッチのみを検出することです。 – JuicyFruit

0

私はタッチでキーボードを隠すことができるように、UITapGestureRecognizerをスーパービューに追加したので、これが起こっていることがわかりました。しかし実際には、なぜこの場合マルチタッチで動作するのか理解できていませんか?私は間違いがすべてのタップイベントをブロックすべきであることを示唆しています。

0

あなたのクラスでUIGesture認識器のデリゲートを追加することで、この問題を解決することができます。あなたのクラスにUIGestureRecognizerDelegateを追加してください。次の手順に従います。 -

/*

class SignupInstructorViewController: UIViewController, UIGestureRecognizerDelegate 

注: -今、あなたはこのように、このジェスチャーデリゲートを実装する必要が他にどこいくつかのtableViewをたたいたりしているかどうかを識別するために。

// MARK: - ジェスチャー代表者

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { 
    // if user touch the tableview then below condition will be true 
    if touch.view != nil && (touch.view!.isDescendantOfView(tableViewName)) { 
     return false 
    } 
    return true 
} 

うまくいけば、それはあなたのために働くだろう。

ありがとうございました。

*/

関連する問題