2016-10-01 103 views
1

什麼可以使UITableViewCell僅檢測多點觸控?如果我用一個手指點擊它不會叫didSelectRowAtIndexdidSelectRowAt僅在多點觸控上調用

這裏是我的代碼:

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類,:

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

我覺得這個問題是不是在didSelectRowAt但在一個UITableViewCell ... 是您在使用設計xib時的約束邏輯? 有可能是一些對象(標籤或imageView)觸摸產生問題... 審查您的約束或設計您的tableViewCell直接在故事板uitableView。

+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 
} 

希望,它會爲你的作品。

在此先感謝。

*/