Swift中如何避免重复编写序号化的按钮点击函数?
优化重复按钮点击函数的可行方案
下面提供几种彻底消除50个重复函数的方案,都是iOS开发中常用的简化手段:
方案1:利用UIButton的tag属性(最传统高效)
给每个按钮设置对应数组索引的tag,只写一个通用点击函数,通过tag直接匹配数组元素:
// 批量绑定按钮事件时循环设置tag for index in 0..<50 { let button = yourButtonCollection[index] // 替换成你的按钮获取方式(数组/控件集合) button.tag = index button.addTarget(self, action: #selector(commonChooseOfferTapped(_:)), for: .touchUpInside) } // 通用点击处理函数 @objc private func commonChooseOfferTapped(_ sender: UIButton) { guard sender.tag < arrayCatched.count else { return } // 防越界 let targetItem = arrayCatched[sender.tag] // 业务逻辑复用 let rdvVC = ChooseRdvVC() rdvVC.targetData = targetItem // 替换成你的数据传递属性 HapticsManager.shared.triggerVibration() navigationController?.pushViewController(rdvVC, animated: true) }
方案2:用闭包绑定点击事件(更灵活,无tag依赖)
给UIButton扩展闭包点击能力,绑定事件时直接捕获对应索引,避免tag冲突风险:
// UIButton扩展:支持闭包形式的点击事件 extension UIButton { private enum AssociatedKey { static var tapAction: UInt8 = 0 } private var tapAction: (() -> Void)? { get { objc_getAssociatedObject(self, &AssociatedKey.tapAction) as? (() -> Void) } set { objc_setAssociatedObject(self, &AssociatedKey.tapAction, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } func addTapAction(_ action: @escaping () -> Void) { tapAction = action addTarget(self, action: #selector(performTapAction), for: .touchUpInside) } @objc private func performTapAction() { tapAction?() } } // 批量绑定按钮事件 for index in 0..<50 { let button = yourButtonCollection[index] button.addTapAction { [weak self] in guard let self = self, index < self.arrayCatched.count else { return } let targetItem = self.arrayCatched[index] // 相同业务逻辑 let rdvVC = ChooseRdvVC() rdvVC.targetData = targetItem HapticsManager.shared.triggerVibration() self.navigationController?.pushViewController(rdvVC, animated: true) } }
方案3:使用RxSwift(如果项目已集成)
如果项目用了RxSwift,直接通过响应式绑定处理,代码更简洁:
import RxSwift import RxCocoa // 批量绑定 let disposeBag = DisposeBag() for index in 0..<50 { let button = yourButtonCollection[index] button.rx.tap .subscribe(onNext: { [weak self] in guard let self = self, index < self.arrayCatched.count else { return } let targetItem = self.arrayCatched[index] let rdvVC = ChooseRdvVC() rdvVC.targetData = targetItem HapticsManager.shared.triggerVibration() self.navigationController?.pushViewController(rdvVC, animated: true) }) .disposed(by: disposeBag) }
推荐优先用方案1(无额外依赖,性能最优),如果担心tag冲突(比如按钮已有其他tag用途),则选方案2。
内容的提问来源于stack exchange,提问作者JOHNY
相关产品推荐
相关产品推荐

