UIBarButtonItem不触发动作及其他iOS开发相关问题咨询
我来逐个帮你解决这些iOS开发中的问题:
这种情况通常是几个常见细节出了问题,你可以按下面的步骤排查:
- 检查Target与Selector的匹配性:确保你的动作方法的selector写法完全对应,比如方法是
@objc func addButtonTapped(_ sender: UIBarButtonItem),那selector必须写成#selector(addButtonTapped(_:))——别漏了后面的冒号!另外,如果target是self,要确认当前ViewController没有被提前释放(可以在deinit方法里加个打印,看看视图控制器是不是已经销毁了,比如有没有循环引用或者被意外弹出栈)。 - 确认按钮的添加位置:你是不是把按钮正确设置给了
navigationItem.rightBarButtonItem或navigationItem.leftBarButtonItem?别不小心加到toolbar或者其他无关视图上了。如果是用自定义View创建的UIBarButtonItem,要确保自定义View的userInteractionEnabled是true(默认是true,但可能被误改)。 - 排查视图遮挡问题:有时候navigationBar上可能有透明的上层视图拦截了点击事件,你可以用Xcode的View Debugger查看视图层级,确认你的按钮是最上层的可交互视图。
- 检查是否重复覆盖设置:有没有在
viewWillAppear或者其他生命周期方法里重新设置了navigationItem的barButtonItem?如果后面的设置覆盖了原来绑定动作的按钮,自然会导致点击无响应。
注意:UITabBarButton是苹果的私有类,直接修改它的属性可能过不了App Store审核,而且系统版本更新后容易失效,推荐用更安全的自定义方案:
- 自定义UITabBarItem的CustomView:给每个Tab创建一个自定义UIButton,自己设置边框样式,再把这个按钮设为UITabBarItem的
customView。这种方式完全可控,没有私有API风险:import QuartzCore // 创建自定义按钮 let customTabButton = UIButton(type: .system) customTabButton.setImage(UIImage(systemName: "house"), for: .normal) customTabButton.setTitle("首页", for: .normal) // 设置边框 customTabButton.layer.borderWidth = 1.0 customTabButton.layer.borderColor = UIColor.blue.cgColor customTabButton.layer.cornerRadius = 8.0 // 绑定到TabBarItem let homeTabItem = UITabBarItem(customView: customTabButton) - (不推荐)通过Runtime获取UITabBarButton:如果一定要修改系统原生按钮,可以遍历UITabBar的子视图,找到类名包含"UITabBarButton"的视图再添加边框,但要做好兼容和审核风险的准备:
for subview in tabBar.subviews { if subview.className.contains("UITabBarButton") { subview.layer.borderWidth = 1 subview.layer.borderColor = UIColor.green.cgColor } }
Swift中通用的「添加」按钮(样式/图标)
苹果提供了现成的方案,不用自己从零做:
- 系统自带的Add BarButtonItem:直接用
UIBarButtonItem的系统样式,这是苹果设计的标准加号按钮,自带图标和交互反馈:let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addAction)) navigationItem.rightBarButtonItem = addButton - SF Symbols加号图标:如果需要自定义按钮(比如放在TabBar、普通视图里,或者修改颜色大小),可以用苹果的SF Symbols库中的"plus"系列图标,比如:
SF Symbols里还有// 创建带加号图标的UIButton let addButton = UIButton(type: .system) addButton.setImage(UIImage(systemName: "plus"), for: .normal) addButton.addTarget(self, action: #selector(addAction), for: .touchUpInside) // 或者直接创建UIBarButtonItem let addBarButton = UIBarButtonItem(image: UIImage(systemName: "plus"), style: .plain, target: self, action: #selector(addAction))plus.circle、plus.square等变体,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Ofri
相关产品推荐
相关产品推荐

