iOS单个bar button item随segmented control选中项切换动作的修复问题
问题根因
- 你当前的按钮配置逻辑,仅在
viewDidLoad、viewDidAppear两个生命周期节点执行。这两个方法的触发时机是页面完成初始化、页面每次向用户呈现,不会在用户和分段控件发生交互(手动切换选中分段)时自动执行。 - 也就是说,用户在页面上点击切换到Playlists分段时,系统根本不会重新调用
settearButton,按钮的action会一直停留在页面初始加载时(此时默认选中第0个Songs分段)设置的irAAgregarCancionesVC,自然无论选中哪个分段,都只会执行action1。
修复方案
方案1:补充分段控件的状态监听,复用现有配置逻辑
这是最小改动的修复方式:
- 在视图初始化完成的节点(比如
viewDidLoad中),给分段控件添加值变化事件的监听:
segmentFiltroMusica.addTarget(self, action: #selector(segmentSelectionDidChange), for: .valueChanged)
- 实现监听回调,直接调用现有
settearButton完成按钮配置刷新:
@objc private func segmentSelectionDidChange() { settearButton() }
这样每次用户手动切换分段控件的选中项,都会自动重新匹配对应分段的按钮action。
方案2:更稳定的工程化实现
反复动态修改UIBarButtonItem的target和action,属于非常规的事件绑定逻辑,长期维护容易出现状态不同步的问题。更稳妥的实现逻辑是:
- 给bar button只绑定一个统一的入口响应方法,在方法内部读取当前分段的选中状态,再分发到对应的业务逻辑,全程不需要动态修改按钮的绑定关系。
具体实现步骤:
- 在
viewDidLoad中一次性完成按钮的基础绑定:
// 按钮仅在初始化时绑定一次统一响应入口 btnAgregarMusica.target = self btnAgregarMusica.action = #selector(addButtonTapped)
- 实现统一响应方法,根据分段状态执行对应逻辑:
@objc private func addButtonTapped() { switch segmentFiltroMusica.selectedSegmentIndex { case 0: irAAgregarCancionesVC() case 1: irAAgregarPlaylistsVC() default: break } }
补充说明:原
settearButton方法中,两个分支重复设置btnAgregarMusica.target = self的代码属于冗余逻辑——target属性只需要在控件初始化时设置一次即可,重复赋值没有实际效果。
内容的提问来源于stack exchange,提问作者ttvcysx
相关产品推荐
相关产品推荐

