tvOS 17更新后UITableView的didSelectRowAt失效问题求助
tvOS 17更新后UITableView的didSelectRowAt方法无法触发
更新tvOS 17后,我的UITableView的didSelectRowAt方法不再触发。选中表格单元格时,该方法不会被调用,焦点反而会转移到其他位置。
已尝试的排查步骤
- 设置
table_view.dataSource = self - 设置
table_view.delegate = self - 开启
table_view.allowsSelection = true - 将所有UITapGestureRecognizer的
cancelsTouchesInView设为false,甚至移除所有手势仍无效 - 确保表格、单元格及内部内容均开启User Interaction Enabled
- 尝试注释表格和单元格的
pressesBegan方法,无效果后恢复
表格视图代码(已省略部分内容)
@IBDesignable class channel_list_view: UIView, UITableViewDelegate, UITableViewDataSource, slice_view_event_receiver, channel_list_table_cell_event_receiver { @IBOutlet weak var channel_list_table_view: UITableView! var view: UIView! override init(frame: CGRect) { super.init(frame: frame) common_init() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) common_init() } func common_init() { view = load_view_from_nib() view.frame = bounds addSubview(view) channel_list_table_view.allowsSelection = true channel_list_table_view.register(UINib(nibName: "channel_list_table_cell", bundle: nil), forCellReuseIdentifier: "channel_list_table_cell") channel_list_table_view.dataSource = self channel_list_table_view.delegate = self channel_list_table_view.remembersLastFocusedIndexPath = true let left_swipe_recogniser = UISwipeGestureRecognizer(target: self, action: #selector(swipe_gesture_occurred)) left_swipe_recogniser.direction = .left view.addGestureRecognizer(left_swipe_recogniser) } override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) { // Code here gets called for press in presses { if press.type == .leftArrow { event_receiver?.leave_channel_list(selected_guide_item: nil) return } } super.pressesBegan(presses, with: event) } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // NOT WORKING - Code here isn't getting called } }
表格单元格代码(已省略部分内容)
@IBDesignable class channel_list_table_cell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() // Initialization code layer.cornerRadius = ui_constants.corner_radius listen_for_gestures() } func listen_for_gestures() { let swipe_recogniser = UISwipeGestureRecognizer(target: self, action: #selector(swipe_gesture_occurred)) swipe_recogniser.direction = .right self.addGestureRecognizer(swipe_recogniser) } override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) { for press in presses { if press.type == .rightArrow { event_receiver?.slice_open(cell: self) return } } super.pressesBegan(presses, with: event) } func ignore_gestures() { gestureRecognizers?.removeAll() } @objc func swipe_gesture_occurred(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case .right: event_receiver?.slice_open(cell: self) default: break } } } }
表格单元格包含的视图代码(供参考)
@IBDesignable class channel_view: UIView { @IBOutlet weak var programme_image: UIImageView! @IBOutlet weak var channel_image: UIImageView! @IBOutlet weak var programme_title: marquee_view! @IBOutlet weak var channel_name: marquee_view! @IBOutlet weak var channel_number: UILabel! @IBOutlet weak var progress: progress_line_view! @IBOutlet weak var slice_arrow: UILabel! // A bunch of setters and getters... override init(frame: CGRect) { super.init(frame: frame) common_init() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) common_init() } func common_init() { view = load_view_from_nib() view.frame = bounds addSubview(view) programme_title.backgroundColor = UIColor.init(hex: UInt32(0x324a6eff)) programme_title.font_colour = UIColor.white channel_name.backgroundColor = UIColor.init(hex: UInt32(0x00000000)) channel_name.font_colour = UIColor.white channel_number.textColor = UIColor.white } }
内容的提问来源于stack exchange,提问作者Alexander Le
相关产品推荐
相关产品推荐

