Ios Swift:[CoreBluetooth]解除popover控制器后XPC连接无效
我有2个ViewController(ViewController和SecondViewController) SecondViewController是一个显示为popover的tableView。 tableView将列出所有发现的可编程设备,当用户点击单元格时,它将连接到所选设备 在用户关闭popover之前,一切正常,当popover关闭时,将立即打印以下错误。 [CoreBluetooth]XPC连接无效 我正在使用协议代理来传递外围设备和特性 这是我的SecondViewController中的内容:Ios Swift:[CoreBluetooth]解除popover控制器后XPC连接无效,ios,swift,xcode,core-bluetooth,Ios,Swift,Xcode,Core Bluetooth,我有2个ViewController(ViewController和SecondViewController) SecondViewController是一个显示为popover的tableView。 tableView将列出所有发现的可编程设备,当用户点击单元格时,它将连接到所选设备 在用户关闭popover之前,一切正常,当popover关闭时,将立即打印以下错误。 [CoreBluetooth]XPC连接无效 我正在使用协议代理来传递外围设备和特性 这是我的SecondViewContro
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!)
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
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
}
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
在我的ViewController的某个地方,我正在If语句中使用deviceReady。但它显示线程1:Fatal error:在隐式展开可选值时意外发现nil
似乎没有调用协议func
我能得到一些帮助吗?我的解决方法很简单。我只是将ViewController设置为静态,然后为外围设备属性创建setter函数,然后在SecondViewController中调用setter函数。现在可以用了 在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!)
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
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
}
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
在SecondViewController中:
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!)
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
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
}
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
我希望这能帮助别人
**在整个研究过程中,我发现外围设备不能作为弱引用传递 我的解决方案有点简单。我只是将ViewController设置为静态,然后为外围设备属性创建setter函数,然后在SecondViewController中调用setter函数。现在可以用了 在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!)
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
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
}
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
在SecondViewController中:
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!)
extension ViewController: PassDataDelegate {
func passPeripheral(_ device: CBPeripheral!) {
self.device = device
}
func passCharacteristic(_ characteristic: CBCharacteristic!) {
self.characteristic = characteristic
self.deviceReady = true
}
}
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
}
if let controller = ViewController.vc {
controller.setCB(centralManager: centralManager, deviceToConnect: deviceToConnect, char: char, deviceReady: deviceReady)
}
我希望这能帮助别人
**在整个研究过程中,我发现外围设备不能作为弱引用传递
SecondViewController
解雇后是否取消初始化?我认为委托
应该是弱
属性。@vpoltave no它没有取消初始化。感谢您的评论,您对如何从popover传递外围设备和特征有什么想法吗?您能否显示您将此var委托:PassDataDelegate?
属性分配到哪里?解除后是否进行了SecondViewController
解除初始化?我认为委托
应该是弱
属性。@vpoltave no它没有取消初始化。感谢您的评论,您对如何从popover传递外围设备和特性有什么想法吗?您能说明您在哪里分配此var delegate:PassDataDelegate?
属性吗?