didSelectRowAt вызывается только на мультитач

Что может заставить UITableViewCell обнаруживать только мультитач? Если я нажму одним пальцем, он не вызывает didSelectRowAtIndex.

Вот мой код:

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

person JuicyFruit    schedule 01.10.2016    source источник
comment
Почему вы помещаете свой код в DispatchQueue.main.async? Удалите его и попробуйте.   -  person Devil    schedule 01.10.2016
comment
Я добавил это, потому что, если я этого не сделаю, будет большая задержка перед представлением VC (я нашел это решение давно) и на 100% уверен, что это не настоящая проблема.   -  person JuicyFruit    schedule 01.10.2016
comment
Тот же код отлично работает в моем случае   -  person Devil    schedule 01.10.2016
comment
Вы имели в виду что-то вроде двойного нажатия на ячейку ..?   -  person vaibhav    schedule 01.10.2016
comment
нет касания двумя и более пальцами   -  person JuicyFruit    schedule 01.10.2016
comment
Да, это возможно, но вы должны реализовать распознаватель жестов, который может привести к отключению метода didSelectRowAtIndexPath.   -  person vaibhav    schedule 01.10.2016
comment
именно в этом и была проблема, а почему работает мультитач?   -  person JuicyFruit    schedule 01.10.2016
comment
не уверен, но мультитач в любом случае может вызвать неопределенное поведение, я думаю, вы получили свое решение.   -  person vaibhav    schedule 01.10.2016


Ответы (5)


Вы можете обрабатывать поведение метода uitableviews's didSelectRowAt после реализации методов делегата распознавателя жестов. Это предотвращает неопределенное поведение касаний между uiview и tableViewCell и сохраняет запись касаний.

Метод 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
    }
}
person vaibhav    schedule 01.10.2016

Я понял, что это произошло, потому что я добавил UITapGestureRecognizer в свой супервизор, чтобы я мог скрывать клавиатуру при касании. Но собственно до сих пор не понимаю, почему в данном случае работал мультитач? Я бы предположил, что моя ошибка должна блокировать все события касания.

person JuicyFruit    schedule 01.10.2016

Я думаю, что проблема не в didSelectRowAt, а в UITableViewCell... вы используете логику ограничения при разработке xib? Возможно, что какой-то объект (метка или изображение) создает проблему с сенсорным экраном... просмотрите свое ограничение или создайте свой tableViewCell непосредственно в uitableView из раскадровки.

person Alessio Campanelli    schedule 01.10.2016
comment
Я разработал его в раскадровке. Проблема в том, что, насколько мне известно, он должен либо обнаруживать касание (все хорошо), либо не обнаруживать (некоторые виды наложения и т. д.), но обнаруживает только мультитач, что странно. - person JuicyFruit; 01.10.2016

Вы можете решить эту проблему, добавив в свой класс делегат распознавателя жестов 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
}

HopeFully, это сработает для вас.

Заранее спасибо.

*/

person Mandeep Singh    schedule 01.10.2016

Вы можете проверить, происходит ли это из-за какого-либо жеста, удалив все жесты представления, как показано ниже, и попробуйте.

view.gestureRecognizers?.removeAll()

Лучше найти точный жест, который вызывает проблему, и правильно с ним справиться.

person Lahiru Pinto    schedule 21.02.2021