Swift: [CoreBluetooth] XPC 连接在关闭 popover 控制器后无效
Swift: [CoreBluetooth] XPC connection invalid after dismissing popover controller
我有 2 个 ViewController(ViewController 和第二个ViewController)。
第二个ViewController 是一个显示为弹出窗口的 tableView。
tableView 将列出所有发现的 BLE 设备,当用户点击单元格时,它将连接到所选设备。
在用户关闭弹出窗口之前一切正常,当弹出窗口关闭时将立即打印以下错误。
[CoreBluetooth] XPC 连接无效
我正在使用协议委托来传递外设和特征
这是我的第二个ViewController:
protocol PassDataDelegate {
func passPeripheral(_ deviceToConnect: CBPeripheral!)
func passCharacteristic(_ char: CBCharacteristic!)
}
class SecondViewController: UIViewController, CBPeripheralDelegate {
...
var peripherals = Array<CBPeripheral>()
var deviceToConnect: CBPeripheral?
var char: CBCharacteristic?
var deviceReady: Bool?
var delegate: PassDataDelegate?
...
}
//passing variables
delegate?.passPeripheral(deviceToConnect!)
delegate?.passCharacteristic(char!)
这是我的 ViewController:
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
在我的 ViewController 的某处,我在 If 语句中使用了 deviceReady。但它显示 Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value .
好像没有调用协议函数?
我可以得到一些帮助吗?
我的解决方案有点简单。我只是将 ViewController 设置为静态,然后为外围设备属性创建一个 setter 函数,然后在 SecondViewController 中调用 setter 函数。现在可以使用了!!
在ViewController中:
static var vc: ViewController?
...
func setCB(centralManager: CBCentralManager, deviceToConnect: CBPeripheral, char: CBCharacteristic, deviceReady: Bool) {
self.centralManager = centralManager
self.deviceToConnect = deviceToConnect
self.char = char
self.deviceReady = deviceReady
}
秒ViewController:
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
我希望这可以帮助某人..
**通过我的研究,我发现外设不能作为弱引用传递!!
我有 2 个 ViewController(ViewController 和第二个ViewController)。
第二个ViewController 是一个显示为弹出窗口的 tableView。 tableView 将列出所有发现的 BLE 设备,当用户点击单元格时,它将连接到所选设备。
在用户关闭弹出窗口之前一切正常,当弹出窗口关闭时将立即打印以下错误。 [CoreBluetooth] XPC 连接无效
我正在使用协议委托来传递外设和特征
这是我的第二个ViewController:
protocol PassDataDelegate {
func passPeripheral(_ deviceToConnect: CBPeripheral!)
func passCharacteristic(_ char: CBCharacteristic!)
}
class SecondViewController: UIViewController, CBPeripheralDelegate {
...
var peripherals = Array<CBPeripheral>()
var deviceToConnect: CBPeripheral?
var char: CBCharacteristic?
var deviceReady: Bool?
var delegate: PassDataDelegate?
...
}
//passing variables
delegate?.passPeripheral(deviceToConnect!)
delegate?.passCharacteristic(char!)
这是我的 ViewController:
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
在我的 ViewController 的某处,我在 If 语句中使用了 deviceReady。但它显示 Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value .
好像没有调用协议函数?
我可以得到一些帮助吗?
我的解决方案有点简单。我只是将 ViewController 设置为静态,然后为外围设备属性创建一个 setter 函数,然后在 SecondViewController 中调用 setter 函数。现在可以使用了!!
在ViewController中:
static var vc: ViewController?
...
func setCB(centralManager: CBCentralManager, deviceToConnect: CBPeripheral, char: CBCharacteristic, deviceReady: Bool) {
self.centralManager = centralManager
self.deviceToConnect = deviceToConnect
self.char = char
self.deviceReady = deviceReady
}
秒ViewController:
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
我希望这可以帮助某人..
**通过我的研究,我发现外设不能作为弱引用传递!!