2016-11-14 3 views
0

私は非常に初期の問題があります。これは、タップジェスチャ認識機能をカスタムに追加したときですセルdidSelectRowAtメソッドを呼び出すことはできません。テーブルビュー(_ tableView:UITableView、didSelectRowAt indexPath:IndexPath)UITapGestureRecognizerをカスタムUITableViewCellに追加すると動作しません

マイコードは以下の通りです:

import UIKit 

class LanguageViewController: UIViewController { 

    @IBOutlet weak var titleLabel: AvenirUILabel! 
    @IBOutlet weak var backButton: UIButton! 
    @IBOutlet weak var submitButton: PinkUIButton! 
    @IBOutlet weak var addLanguageButton: UIButton! 
    @IBOutlet weak var addAnotherLanguageLabel: UILabel! 
    @IBOutlet weak var tableView: UITableView! 

    @IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint! 

    var numberOfLanguagesSpoken = 2 
    var pickersStartHeight: CGFloat! 
    let downArrowImage = UIImage(named: "arrow_drop_down") 
    let BGColor = UIColor.white.withAlphaComponent(0.1) 
    var tag = 1001 
    var selectedCellHeight: CGFloat = 88.0 
    var unselectedCellHeight: CGFloat = 44.0 
    var selectedCellIndexPath: IndexPath? 
    let languages = ["Akan", "Amharic", "Arabic", "Assamese", "Awadhi", "Azerbaijani", "Balochi", "Belarusian", "Bengali", "Bhojpuri", "Burmese", "Cebuano", "Chewa", "Chhattisgarhi", "Chittagonian", "Czech", "Deccan", "Dhundhari", "Dutch", "Eastern Min", "English", "French", "Fula", "Gan Chinese", "German", "Greek", "Gujarati", "Haitian Creole", "Hakka", "Haryanvi", "Hausa", "Hiligaynon/Ilonggo", "Hindi ", "Hmong", "Hungarian", "Igbo", "Ilocano", "Italian", "Japanese", "Javanese", "Jin", "Kannada", "Kazakh", "Khmer", "Kinyarwanda", "Kirundi", "Konkani", "Korean", "Kurdish", "Madurese", "Magahi", "Maithili", "Malagasy", "Malay", "Malayalam", "Mandarin", "Marathi", "Marwari", "Mossi", "Nepali", "Northern Min", "Odia", "Oromo", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Quechua", "Romanian", "Russian", "Saraiki", "Serbo-Croatian", "Shona", "Sindhi", "Sinhalese", "Somali", "Southern Min", "Spanish", "Sundanese", "Swedish", "Sylheti", "Tagalog/Filipino", "Tamil", "Telugu", "Thai", "Turkish", "Turkmen", "Ukrainian", "Urdu", "Uyghur", "Uzbek", "Vietnamese", "Wu", "Xhosa", "Xiang ", "Yoruba", "Yue ", "Zhuang", "Zulu"] 

    var proficiency = ["Basic","Conversational","Proficient","Fluent","Native"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = backgroundTint 

     // initial set up 

     let height = self.view.bounds.height 

     titleLabel.textColor = .white 

     backButton.addTarget(self, action: #selector(goBack), for: .allTouchEvents) 

     tableView.dataSource = self 
     tableView.delegate = self 
     tableView.register(LanguageProficiencyTableViewCell.self, forCellReuseIdentifier: "Language") 
     tableView.backgroundColor = backgroundTint 
     tableView.allowsSelection = true 
     tableViewHeightConstraint.constant = 2*height/9 


     addLanguageButton.tintColor = .white 
     addLanguageButton.addTarget(self, action: #selector(addNewLanguage), for: .allTouchEvents) 

     addAnotherLanguageLabel.textColor = .white 

     submitButton.addTarget(self, action: #selector(submitChanges), for: .allEvents) 
    } 

    override func viewWillLayoutSubviews() { 
     unselectedCellHeight = self.view.bounds.height/9 
     selectedCellHeight = CGFloat(unselectedCellHeight * 2.0) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func goBack() { 
     self.dismiss(animated: true, completion: nil) 
    } 

    func submitChanges() { 
     self.dismiss(animated: true) { 
      // 
     } 
    } 

    func addNewLanguage() { 
     numberOfLanguagesSpoken += 1 
     UIView.animate(withDuration: 0.5) { 
      // 
     } 
    } 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    } 
    */ 

} 
extension LanguageViewController: UITableViewDataSource, UITableViewDelegate { 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return numberOfLanguagesSpoken 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Language", for: indexPath) as! LanguageProficiencyTableViewCell 
     cell.parentVC = self 
     cell.backgroundColor = .clear 
     cell.languages = self.languages 
     cell.proficiency = self.proficiency 
     return cell 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if selectedCellIndexPath == indexPath { 
      return selectedCellHeight 
     } else { 
      return unselectedCellHeight 
     } 
    } 

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     // 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath as IndexPath { 
      selectedCellIndexPath = nil 
     } else { 
      selectedCellIndexPath = indexPath as IndexPath 
     } 

     tableView.beginUpdates() 
     tableView.endUpdates() 

     if selectedCellIndexPath != nil { 
      // This ensures, that the cell is fully visible once expanded 
      tableView.scrollToRow(at: indexPath as IndexPath, at: .none, animated: true) 
     } 
    } 

    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 
     return indexPath 
    } 
} 

import UIKit 

class LanguageProficiencyTableViewCell: UITableViewCell { 

    let languageLabel = IndentedTextUILabel() 
    var languagePicker = UIPickerView() 
    weak var parentVC: LanguageViewController! 
    var cellHeight: CGFloat = 80 
    var open = false 
    var languages = [""] 
    var proficiency = [""] 
    var pickedLanguage = "" 
    var pickedProficiency = "" 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     self.contentView.addSubview(languageLabel) 
     self.contentView.addSubview(languagePicker) 
     self.contentView.backgroundColor = .clear 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 

    override func layoutSubviews() { 

     let width = self.bounds.width 
     let height = cellHeight 
     let BGColor = UIColor.white.withAlphaComponent(0.1) 

     languageLabel.frame = CGRect(x: 0.0, y: 1.0, width: width, height: height - 1.0) 
     languageLabel.textColor = .white 
     languageLabel.backgroundColor = BGColor 
     languageLabel.text = "Language(Proficiency)" 
     languageLabel.leftInset = 25.0 
     let downArrow = UIButton() 
     let downArrowImage = UIImage(named: "arrow_drop_down") 
     downArrow.setImage(downArrowImage, for: .normal) 
     downArrow.center.y = height/2 
     downArrow.center.x = 4 * width/5 
     languageLabel.addSubview(downArrow) 

     let tap = UITapGestureRecognizer(target: self, action: #selector(cellTapped)) 
     self.addGestureRecognizer(tap) 

     languagePicker.frame = CGRect(x: 0.0, y: self.cellHeight + 1.0, width: self.bounds.width, height: 0.0) 
     languagePicker.delegate = self 
     languagePicker.dataSource = self 
     languagePicker.backgroundColor = UIColor.white.withAlphaComponent(0.05) 
     languagePicker.selectRow(20, inComponent: 0, animated: true) 

     let backGroundView = UIView(frame: CGRect(x: 0.0, y: 1.0, width: width, height: height - 1.0)) 
     backGroundView.backgroundColor = .clear 
     self.selectedBackgroundView = backGroundView 
    } 

    func cellTapped() { 
     UIView.animate(withDuration: 0.2, animations: { 
      if !self.open { 
       self.languagePicker.frame.size.height = self.cellHeight - 2.0 
      } else { 
       self.languagePicker.isHidden = true 
      } 
      }, completion: { (_) in 
       if self.open { 
        self.languagePicker.frame.size.height = 0.0 
        self.languagePicker.isHidden = false 
       } 
       self.open = !self.open 
     }) 
    } 
} 
+0

の可能性のある重複(http://stackoverflow.com/questions/8192480/uitapgesturerecognizer-breaks-uitableview-didselectrowatindexpath) – alexburtnik

+0

あなたは区別する必要があるだろう[UITapGestureRecognizerはのUITableView didSelectRowAtIndexPathが壊れます] - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch :(UITouch *)touchを使用して、TapGestureとdidSelectRowAtIndexPathを実行します。 –

+0

'layoutSubviews()'は何度も呼び出すことができます。常に新しい 'downArrow'を追加し、新しい' tap'認識器を追加します – muescha

答えて

0

タップジェスチャーが自身のタップを取って、その下のビューにタップを送信していないので、それは動作しません。

あなたはタップジェスチャーは、あなたがちょうどあなたができるキーボードを閉じタップジェスチャーを使用している場合もHow to pass a 'tap' to UIButton that is underneath UIView with UISwipeGestureRecognizer?

で説明したように

mySwipeGesture.cancelsTouchesInView = false 

によって背景ビューに渡されるタップを送ることができますテーブルビューのdidAelectAtメソッドで行い、そのメソッドでキーボードを閉じた後に他の操作を行います。

0

私はあなたがやったような何かをしています、それは私のために働いています。

あなたはセルを設定していないときTableViewCellクラスの内部ではなく、あなたのコントローラクラスからジェスチャー認識を追加する必要があります。このよう

class LanguageViewController: UIViewController { 

    @IBOutlet weak var titleLabel: AvenirUILabel! 
    @IBOutlet weak var backButton: UIButton! 
    @IBOutlet weak var submitButton: PinkUIButton! 
    @IBOutlet weak var addLanguageButton: UIButton! 
    @IBOutlet weak var addAnotherLanguageLabel: UILabel! 
    @IBOutlet weak var tableView: UITableView! 

    @IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint! 

    var numberOfLanguagesSpoken = 2 
    var pickersStartHeight: CGFloat! 
    let downArrowImage = UIImage(named: "arrow_drop_down") 
    let BGColor = UIColor.white.withAlphaComponent(0.1) 
    var tag = 1001 
    var selectedCellHeight: CGFloat = 88.0 
    var unselectedCellHeight: CGFloat = 44.0 
    var selectedCellIndexPath: IndexPath? 
    let languages = ["Akan", "Amharic", "Arabic", "Assamese", "Awadhi", "Azerbaijani", "Balochi", "Belarusian", "Bengali", "Bhojpuri", "Burmese", "Cebuano", "Chewa", "Chhattisgarhi", "Chittagonian", "Czech", "Deccan", "Dhundhari", "Dutch", "Eastern Min", "English", "French", "Fula", "Gan Chinese", "German", "Greek", "Gujarati", "Haitian Creole", "Hakka", "Haryanvi", "Hausa", "Hiligaynon/Ilonggo", "Hindi ", "Hmong", "Hungarian", "Igbo", "Ilocano", "Italian", "Japanese", "Javanese", "Jin", "Kannada", "Kazakh", "Khmer", "Kinyarwanda", "Kirundi", "Konkani", "Korean", "Kurdish", "Madurese", "Magahi", "Maithili", "Malagasy", "Malay", "Malayalam", "Mandarin", "Marathi", "Marwari", "Mossi", "Nepali", "Northern Min", "Odia", "Oromo", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Quechua", "Romanian", "Russian", "Saraiki", "Serbo-Croatian", "Shona", "Sindhi", "Sinhalese", "Somali", "Southern Min", "Spanish", "Sundanese", "Swedish", "Sylheti", "Tagalog/Filipino", "Tamil", "Telugu", "Thai", "Turkish", "Turkmen", "Ukrainian", "Urdu", "Uyghur", "Uzbek", "Vietnamese", "Wu", "Xhosa", "Xiang ", "Yoruba", "Yue ", "Zhuang", "Zulu"] 

    var proficiency = ["Basic","Conversational","Proficient","Fluent","Native"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = backgroundTint 

     // initial set up 

     let height = self.view.bounds.height 

     titleLabel.textColor = .white 

     backButton.addTarget(self, action: #selector(goBack), for: .allTouchEvents) 

     tableView.dataSource = self 
     tableView.delegate = self 
     tableView.register(LanguageProficiencyTableViewCell.self, forCellReuseIdentifier: "Language") 
     tableView.backgroundColor = backgroundTint 
     tableView.allowsSelection = true 
     tableViewHeightConstraint.constant = 2*height/9 


     addLanguageButton.tintColor = .white 
     addLanguageButton.addTarget(self, action: #selector(addNewLanguage), for: .allTouchEvents) 

     addAnotherLanguageLabel.textColor = .white 

     submitButton.addTarget(self, action: #selector(submitChanges), for: .allEvents) 
    } 

    override func viewWillLayoutSubviews() { 
     unselectedCellHeight = self.view.bounds.height/9 
     selectedCellHeight = CGFloat(unselectedCellHeight * 2.0) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.view.endEditing(true) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func goBack() { 
     self.dismiss(animated: true, completion: nil) 
    } 

    func submitChanges() { 
     self.dismiss(animated: true) { 
      // 
     } 
    } 

    func addNewLanguage() { 
     numberOfLanguagesSpoken += 1 
     UIView.animate(withDuration: 0.5) { 
      // 
     } 
    } 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    } 
    */ 

} 
extension LanguageViewController: UITableViewDataSource, UITableViewDelegate { 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return numberOfLanguagesSpoken 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Language", for: indexPath) as! LanguageProficiencyTableViewCell 
     cell.parentVC = self 
     cell.backgroundColor = .clear 
     cell.languages = self.languages 
     cell.proficiency = self.proficiency 
     let tap = UITapGestureRecognizer(target: self, action: #selector("cellTapped:")) 
     cell.addGestureRecognizer(tap) 
     return cell 
    } 

    //Change here you can't call languagePicker with self but you have to get it from the object tapped that in your case is you cell 
    func cellTapped(recognizer: UITapGestureRecognizer) { 
     UIView.animate(withDuration: 0.2, animations: { 
      if !self.open { 
       self.languagePicker.frame.size.height = self.cellHeight - 2.0 
      } else { 
       self.languagePicker.isHidden = true 
      } 
      }, completion: { (_) in 
       if self.open { 
        self.languagePicker.frame.size.height = 0.0 
        self.languagePicker.isHidden = false 
       } 
       self.open = !self.open 
     }) 
    } 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
     if selectedCellIndexPath == indexPath { 
      return selectedCellHeight 
     } else { 
      return unselectedCellHeight 
     } 
    } 

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     // 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath as IndexPath { 
      selectedCellIndexPath = nil 
     } else { 
      selectedCellIndexPath = indexPath as IndexPath 
     } 

     tableView.beginUpdates() 
     tableView.endUpdates() 

     if selectedCellIndexPath != nil { 
      // This ensures, that the cell is fully visible once expanded 
      tableView.scrollToRow(at: indexPath as IndexPath, at: .none, animated: true) 
     } 
    } 

    func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { 
     return indexPath 
    } 
} 

import UIKit 

class LanguageProficiencyTableViewCell: UITableViewCell { 

    let languageLabel = IndentedTextUILabel() 
    var languagePicker = UIPickerView() 
    weak var parentVC: LanguageViewController! 
    var cellHeight: CGFloat = 80 
    var open = false 
    var languages = [""] 
    var proficiency = [""] 
    var pickedLanguage = "" 
    var pickedProficiency = "" 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     self.contentView.addSubview(languageLabel) 
     self.contentView.addSubview(languagePicker) 
     self.contentView.backgroundColor = .clear 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)! 
    } 

    override func layoutSubviews() { 

     let width = self.bounds.width 
     let height = cellHeight 
     let BGColor = UIColor.white.withAlphaComponent(0.1) 

     languageLabel.frame = CGRect(x: 0.0, y: 1.0, width: width, height: height - 1.0) 
     languageLabel.textColor = .white 
     languageLabel.backgroundColor = BGColor 
     languageLabel.text = "Language(Proficiency)" 
     languageLabel.leftInset = 25.0 
     let downArrow = UIButton() 
     let downArrowImage = UIImage(named: "arrow_drop_down") 
     downArrow.setImage(downArrowImage, for: .normal) 
     downArrow.center.y = height/2 
     downArrow.center.x = 4 * width/5 
     languageLabel.addSubview(downArrow) 

     languagePicker.frame = CGRect(x: 0.0, y: self.cellHeight + 1.0, width: self.bounds.width, height: 0.0) 
     languagePicker.delegate = self 
     languagePicker.dataSource = self 
     languagePicker.backgroundColor = UIColor.white.withAlphaComponent(0.05) 
     languagePicker.selectRow(20, inComponent: 0, animated: true) 

     let backGroundView = UIView(frame: CGRect(x: 0.0, y: 1.0, width: width, height: height - 1.0)) 
     backGroundView.backgroundColor = .clear 
     self.selectedBackgroundView = backGroundView 
    } 
} 
関連する問題