Почему теряется целевое действие в UITableViewCell?

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я пытаюсь создать пользовательскую UITableViewCell с помощью пользовательского интерфейса и без использования файла storyboard / .xib. Проблема в том, что действие, которое я установил на UISwitch, похоже, потеряно, потому что я не могу вызвать действие селектора при нажатии переключателя. Тогда как addTarget устанавливается после инициализации ячейки. Также нажатие на переключатель не переключает состояние (нет проблем с использованием файла XIB, поэтому проблема не должна исходить от UITableViewController)

 class UISwitchTableViewCell: UITableViewCell {

let switchUI : UISwitch = {
    let switchUI = UISwitch()
    return switchUI
}()

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

    self.selectionStyle = .none
    addSubview(switchUI)
    switchUI.translatesAutoresizingMaskIntoConstraints = false
    switchUI.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    switchUI.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor).isActive = true

    switchUI.addTarget(self, action: #selector(switchChanged), for: .valueChanged)
}

@objc func switchChanged(_ sender: UISwitch){
    print("switch changed")
}

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

}

Ответ №1:

Убедитесь, что вы разрешили выбор UITableView и UITableViewCell

tableView.allowsSelection = true

cell.selectionStyle = .default

Комментарии:

1. selectionStyle — это всего лишь свойство стиля, не влияющее на взаимодействия. И allowsSelection по умолчанию имеет значение true

2. Я спросил стиль выбора, чтобы подтвердить, есть ли какое-либо другое представление, которое перекрывается с представлением содержимого ячейки. Это точно такой же случай, как вы упомянули в своем ответе. Я попросил установить значение разрешить выбор true, потому что иногда по ошибке / другому разработчику устанавливается значение false.

Ответ №2:

Проблема заключалась не в том, что цель была освобождена или что-то подобное. Проблема была вызвана текстовой меткой ячейки по умолчанию (ниже задана желтым фоном), которая перекрывала пользовательский переключатель, предотвращая взаимодействие с касанием. Итак, решение состояло в том, чтобы скрыть эту метку по умолчанию и создать мою собственную с конечным ограничением, равным UISwitch leadingAnchor .

введите описание изображения здесь

Комментарии:

1. Кроме того, переключатель должен быть внутри contentView , иначе рано или поздно произойдут плохие вещи.

2. Не задавайте вопросов в своих решениях. Мы не хотим начинать обсуждения на этом сайте