【问题标题】:How can I get CoreBluetooth delegates to work after moving them to a separate class?将 CoreBluetooth 代表移动到单独的班级后,如何让他们工作?
【发布时间】:2020-04-01 14:21:50
【问题描述】:

我创建了一个小项目来测试 Bluetooth 使用 CoreBluetooth framework。在我的viewController 中,它可以像这样正常工作:

class ViewController: UIViewController {

    var myCentral: CBCentralManager! = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        myCentral = CBCentralManager(delegate: self, queue: nil)

    }
}

extension ViewController: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            central.scanForPeripherals(withServices: nil, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        if let name = peripheral.name {
            print(name)
        }
    }
}

但是,我想将 Bluetooth 的东西移动到另一个 class 并从 viewController 运行它。那可能吗?我的尝试不起作用:

在新的class 中,移动了Bluetooth 的东西:

class BLEhandler: NSObject {
    var centralManager: CBCentralManager!
}

extension BLEhandler: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            central.scanForPeripherals(withServices: nil, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        if let name = peripheral.name {
            print(name)
        }
        print(peripheral.name)
    }
}

并从viewController 调用它:

override func viewDidLoad() {
    super.viewDidLoad()
    var centralManager = BLEhandler().centralManager
    centralManager = CBCentralManager(delegate: self, queue: nil)
}

现在它只显示一个小的log

[CoreBluetooth] XPC 连接无效

我怀疑我可以像这样使用delegates,我认为解决方案与协议有关,但我不确定。您将如何将delegates 转移到其他classes 并仍然让他们工作?

【问题讨论】:

  • 也许当 viewDidLoad 退出时你的 BLEHandler 正在被释放。让它成为你的 viewController 的一个属性来保留它。
  • @FryAnEgg 你能详细说明一下吗?不太确定我明白你的意思:)
  • 看起来你想通了。干杯!

标签: ios swift delegates core-bluetooth


【解决方案1】:

好的,只需先在ViewController 中声明它就可以工作了:

var centralManager: BLEhandler!

然后在viewDidLoadinitialized它:

centralManager = BLEhandler()

而不是直接initializing它在viewDidLoad中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    相关资源
    最近更新 更多