tableView - didSelectRowAtIndexPath не вызывается - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть UITableView, который встроен в UIView, выступая в качестве раскрывающегося списка (см. Изображение).Однако он не реагирует на прикосновения пользователя ячейки (тестирование с использованием функции didSelectRowAtIndexPath).Пожалуйста, см. Код ниже.

Как это работает, это то, что выпадающий список состоит в том, что он является подпредставлением кнопки (которая находится в статическом UITableViewCell), так что при нажатии кнопки, выпадающий видвысота изменяется с 0 на 88 (и высота ячейки тоже изменяется).

Я проверил иерархию представления, и ничто не мешает представлению зарегистрировать касание.

Пользовательский класс раскрывающегося списка

class GenderDropDownView: UIView, UITableViewDelegate, UITableViewDataSource {

var genders = ["male.", "female."]
var tableView = UITableView()

override init(frame: CGRect) {
    super.init(frame: frame)

    self.layer.cornerRadius = 6
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    tableView.delegate = self
    tableView.dataSource = self
    self.addSubview(tableView)

    // Table View constraints
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
    tableView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    tableView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

    // Table view design
    tableView.backgroundColor = .clear
    tableView.separatorStyle = .none
    tableView.allowsSelection = true
    tableView.isUserInteractionEnabled = true
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = genders[indexPath.row]
    cell.textLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium)
    cell.textLabel?.textColor = .white
    cell.textLabel?.textAlignment = .center
    cell.backgroundColor = .clear
    cell.selectionStyle = .none
    cell.isUserInteractionEnabled = true
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(genders[indexPath.row])
}
}

Настройка раскрывающегося представления в родительском UITableViewController

func genderDropdownViewConfig() {
    genderDropdownView.backgroundColor = Constants.azureColor
    genderDropdownView.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
    genderDropdownView.translatesAutoresizingMaskIntoConstraints = false
    genderDropdownButton.addSubview(genderDropdownView)

    genderDropdownButton.addSubview(genderDropdownView)
    tableView.bringSubview(toFront: genderDropdownView)

    genderDropdownView.topAnchor.constraint(equalTo: genderDropdownButton.bottomAnchor).isActive = true
    genderDropdownView.centerXAnchor.constraint(equalTo: genderDropdownButton.centerXAnchor).isActive = true
    genderDropdownView.widthAnchor.constraint(equalTo: genderDropdownButton.widthAnchor).isActive = true
    //genderDropdownHeight = genderDropdownView.heightAnchor.constraint(equalToConstant: 0)
    genderDropdownHeight = genderDropdownView.heightAnchor.constraint(equalToConstant: 0)

    for subview in genderDropdownView.subviews {
        subview.backgroundColor = .clear
    }
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let heights = [280, 130, 103, 103, 103, 103]
    if indexPath.row ==  2 && genderIsOpen == true {
        return 191
    } else {
        return CGFloat(heights[indexPath.row])
    }
}

@objc func genderDropDownTouched() {
    if genderIsOpen == false {
        NSLayoutConstraint.deactivate([self.genderDropdownHeight])
        genderDropdownHeight.constant = 88
        genderIsOpen = true
        NSLayoutConstraint.activate([self.genderDropdownHeight])

        // Editing height of cell
        tableView.reloadData()

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
            self.genderDropdownView.layoutIfNeeded()
            self.genderDropdownView.center.y += self.genderDropdownView.frame.height / 2
        }, completion: nil)
    } else {
        NSLayoutConstraint.deactivate([self.genderDropdownHeight])
        genderDropdownHeight.constant = 0
        genderIsOpen = false
        NSLayoutConstraint.activate([self.genderDropdownHeight])

        // Editing height of cell
        tableView.reloadData()

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
            self.genderDropdownView.center.y -= self.genderDropdownView.frame.height / 2
            self.genderDropdownView.layoutIfNeeded()
        }, completion: nil)
    }
}

enter image description here

enter image description here

1 Ответ

0 голосов
/ 29 сентября 2018

Как это работает, так это то, что выпадающий список является подпредставлением кнопки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...