Ios Swift:[CoreBluetooth]解除popover控制器后XPC连接无效

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

我有2个ViewController(ViewController和SecondViewController)

SecondViewController是一个显示为popover的tableView。 tableView将列出所有发现的可编程设备,当用户点击单元格时,它将连接到所选设备

在用户关闭popover之前,一切正常,当popover关闭时,将立即打印以下错误。 [CoreBluetooth]XPC连接无效

我正在使用协议代理来传递外围设备和特性

这是我的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的某个地方,我正在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?
属性吗?