Swift中如何检测用户点击UISegmentControl已选中分段的事件?
UISegmentedControl 点击已选中分段无响应问题解决方案
问题根因
UISegmentedControl 原生设计下,
valueChanged事件仅在 选中分段发生变更 时触发,点击已选中分段不会触发状态变化,因此该事件不会响应。同时其内部会默认拦截普通触控事件,直接绑定touchUpInside、allEvents也无法触达外部回调。
可选实现方案
方案1:添加点击手势识别(无侵入,适合单次场景使用)
直接给目标 UISegmentedControl 添加全局点击手势,每次点击都会触发回调,不会影响原生选中逻辑:
// 视图加载完成后添加手势 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(segmentTapped(_:))) yourSegmentControl.addGestureRecognizer(tapGesture) // 回调逻辑实现 @objc func segmentTapped(_ gesture: UITapGestureRecognizer) { guard let segment = gesture.view as? UISegmentedControl, segment.isEnabled else { return } let selectedIndex = segment.selectedSegmentIndex // 此处编写你的业务逻辑,无论选中分段是否变化都会执行 }
方案2:子类化 UISegmentedControl(适合全局统一行为场景)
重写触控结束方法,手动触发valueChanged事件,原有绑定的事件无需修改即可生效:
class AlwaysTriggerSegmentControl: UISegmentedControl { override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { let previousSelectedIndex = selectedSegmentIndex super.touchesEnded(touches, with: event) // 即使选中索引未变化也手动触发事件 if previousSelectedIndex == selectedSegmentIndex { sendActions(for: .valueChanged) } } }
使用时仅需要将你的 UISegmentedControl 自定义类设置为AlwaysTriggerSegmentControl即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

