Не работают экшены элементов внутри ячеек таблиц (ios14 xcode12)


#1

Кто тоже столкнулся с проблемой?
Раньше всё работало: ячейка в таблице, внутри элемент кодом (например свитч), на нём экшен кодом - всё работало отлично.
После обновы на xcode12 все экшены умерли: те при тапе на элементе вообще функция экшена не срабатывает какбуд-то тапа не было. Хотя тап на саму ячейку работает и дидСелект срабатывает…

Был функционал такой:

Теперь при тапе на свитч никакой эффекта. Код не менялся, только обнова встала… Хотел обнову выпустить для проги: виджеты добавить, а тут подстава…


#2

Создал пустой проект, положил свитч в таблицу, всё работает :roll_eyes:


#3

Вопрос о проектах, созданных до xcode12…

fileprivate func createCell0() -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell0")

        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.systemFont(ofSize: 18, weight: .light)
        label.numberOfLines = 2
        label.text = "label"

        let repaySwitch = UISwitch(frame: CGRect(x: 0, y: 0, width: 47, height: 31))
        repaySwitch.addTarget(self, action: #selector(repaySwitchAction(sender: )), for: .valueChanged)
        repaySwitch.translatesAutoresizingMaskIntoConstraints = false
        repaySwitch.widthAnchor.constraint(equalToConstant: 49).isActive = true
        
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .horizontal
        stackView.distribution = .fill
        stackView.addArrangedSubview(label)
        stackView.addArrangedSubview(repaySwitch)
        stackView.alignment = .center
        
        cell.addSubview(stackView)
        stackView.leftAnchor.constraint(equalTo: cell.leftAnchor, constant: 16).isActive = true
        stackView.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -16).isActive = true
        stackView.topAnchor.constraint(equalTo: cell.topAnchor, constant: 8).isActive = true
        stackView.bottomAnchor.constraint(equalTo: cell.bottomAnchor, constant: -8).isActive = true
        stackView.heightAnchor.constraint(equalToConstant: 44).isActive = true
        
        return cell
    }

@objc func repaySwitchAction(sender: UISwitch) {
        print(#function)
}

не робит )))


#4

У UITableViewCell есть contentView на него весь контент нужно (обычно) добавлять, исправьте так:

cell.contentView.addSubview(stackView)

Или так:

cell.contentView.isUserInteractionEnabled = false

#5

Аллилуя )))) Спасибо большое!
Вопрос: почему раньше работало? Иерархия поменялась?
Интересно, что изменилось, чтобы понимать…


#6

Видимо contentView добавляется после создания ячейки и перекрывает ваш вью.


#7

А делали бы все через интерфейс, проблем бы не было :smiley:


#8

:smile: _________________


#9

кстати, непохоже - свитч сверху всего лежит

или баг или изменили приоритет отработки взаимоедйствий или ещё чего


#10

Или банально сделали isUserInt по дефолту true.


#11

Но тут очень странно все, я столкнулся с такой же проблемой, что все control элементы в ячейках не отрабатывают, а странность в том, что на втором - третьем запуске приложения(не компиляции, а выгрузке из памяти), все работает прекрасно


#12

Или почитали документацию

https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview


#13

У меня перед contentView лежал, видно раз на раз


#14

Кто в наше время их читает. А даже если и читают, то вникают ли…
А так через IB всегда элементы лежат в contentView. Так что проблем не было бы.


#15

Очень странно писать UI кодом и даже не заглянуть в UITableViewCell :roll_eyes:


#16

ой все)
Раньше по другому было написано)


#17

По сути там было написано тоже самое :slight_smile:


#18

Ну не совсем с вами согласен, но это уже не важно)