bar button item(scan)的Sent Action设置异常,蓝牙传感器扫描列表失效求助
我来帮你理清楚这个问题~ 核心原因很明确:你的非工作版本把scan按钮的触发逻辑只绑定了unwind segue,而没有关联到实际执行蓝牙扫描的scan方法。Unwind segue的作用只是完成页面跳转,它本身不会帮你执行扫描传感器的代码,这就是为什么你能跳转到table view但看不到设备列表的原因。
下面是具体的修复步骤,一步步来:
第一步:确保扫描逻辑的scan方法存在且正确
先检查包含scan按钮的ViewController里有没有这个方法,应该类似这样(以Swift为例):
@IBAction func scan(_ sender: UIBarButtonItem) { // 这里是蓝牙扫描的核心代码,比如初始化CBCentralManager、开始扫描外设等 centralManager.scanForPeripherals(withServices: nil, options: nil) }
如果没有的话,直接把正常工作版本里的这个方法复制过来,同时要确保蓝牙相关的配套逻辑(比如CBCentralManager的代理设置、扫描结果回调)都完整迁移过来。
第二步:重新绑定按钮的Sent Action到scan方法
- 打开Storyboard,找到那个有问题的scan Bar Button Item
- 右键点击按钮,在弹出的菜单里定位到Sent Actions区域
- 删掉现有的unwind segue绑定(点击绑定项旁边的叉号)
- 点击
+号,从下拉列表里选择对应的ViewController,再选中scan:方法- 如果列表里没显示这个方法,先检查ViewController的类是否正确关联到Storyboard上,或者
scan方法有没有添加@IBAction修饰符
- 如果列表里没显示这个方法,先检查ViewController的类是否正确关联到Storyboard上,或者
第三步:按需处理页面跳转(如果需要先跳转再扫描)
如果你的需求是点击scan按钮后先跳转到table view,再执行扫描,那不能只依赖unwind segue,而是要在scan方法里手动触发跳转+扫描逻辑:
@IBAction func scan(_ sender: UIBarButtonItem) { // 先启动蓝牙扫描 centralManager.scanForPeripherals(withServices: nil, options: nil) // 手动触发跳转到table view的segue(记得替换成你自己的segue标识) performSegue(withIdentifier: "ShowSensorListSegue", sender: self) }
记得在Storyboard里给跳转到table view的segue设置一个唯一的identifier(比如"ShowSensorListSegue"),再替换代码里的对应内容。
额外检查点
- 确认table view的数据源方法(
numberOfRowsInSection、cellForRowAt)正确关联了存储扫描设备的数组,当扫描到新设备时要调用tableView.reloadData()刷新列表 - 检查Info.plist里是否配置了蓝牙权限:根据iOS版本添加
NSBluetoothAlwaysUsageDescription或NSBluetoothPeripheralUsageDescription,否则蓝牙扫描会被系统拦截
这样调整后,点击scan按钮就会同时触发扫描逻辑和页面跳转,和正常工作的版本行为一致啦!
内容的提问来源于stack exchange,提问作者Vinny Twice
相关产品推荐
相关产品推荐

