从2个UIViewControllers上的BLE设备读取值

时间:2017-06-22 23:36:40

标签: swift bluetooth-lowenergy ios10 uart

目前,我的MainViewController可以连接到我的蓝牙模块并读取来自它的数据。 现在,我试图从另一个View Controller读取数据。

我的蓝牙管理器是一个单例,因此它不会多次实例化。为了在适当的ViewController中读取和处理数据,我考虑使用可选的委托。当我收到MVC(数据:字符串)时它工作正常,但是当收到来自UVC(数据:字符串)时崩溃

我收到以下错误:

  

[BLE_Tests.MainViewController receivedUVCWithData:]:无法识别   选择器发送到实例 0x100d0a9d0 2017-06-22 16:25:58.634682-0700   BLE_Tests [9544:2692419] *因未捕获的异常而终止应用   ' NSInvalidArgumentException',原因:' - [BLE_Tests.MainViewController   ** receivedUVCWithData:]:无法识别的选择器发送到实例   0x100d0a9d0'

如果我将receivedUVC(data:String)添加到我的MainViewController,它不会崩溃,但不会从正确的ViewController调用receivedUVC。

如何指向正确的选择器?

谢谢。

MainViewController.swift

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, BluetoothDelegate {

    @IBOutlet weak var peripheralListTableView: UITableView!
    @IBOutlet weak var updateButton: UIButton!

    let bluetoothManager = BluetoothManager.getInstance()      

    override func viewDidLoad() {
        super.viewDidLoad()

        peripheralListTableView.delegate = self
        peripheralListTableView.dataSource = self

        bluetoothManager.delegate = self
        bluetoothManager.discover()

    }

    func reloadPeripheralList() {
        peripheralListTableView.reloadData()
    }

    func receivedMVC(data: String) {
        print("Hello? \(data)")
    }

    //MARK: - UITableViewDataSource

}

UpdateViewController.swift

class UpdateViewController: UIViewController, BluetoothDelegate {

    let bluetoothManager = BluetoothManager.getInstance()

    func receivedUVC(data: String) {
        print("Allo: \(data)")
    }
}

BluetoothManager.swift

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {        
    let stringValue = String(data: characteristic.value!, encoding: String.Encoding.utf8)!
    print("Received packet: \(stringValue)")

    delegate?.receivedMVC!(data: stringValue) // Delegate method in MainViewController
    delegate?.receivedUVC!(data: stringValue) // Delegate method in UpdateViewController
}

1 个答案:

答案 0 :(得分:0)

  

[BLE_Tests.MainViewController ** receivedUVCWithData:]

这告诉您调用了MainViewController方法receivedUVCWithData:但该类没有实现它。这就是它被称为的原因:

delegate?.receivedUVC!(data: stringValue)

此调用将检查代理是否存在,如果存在,则向receiveUVC发送必须(!)存在的消息。所以如果你这样称它就不会崩溃:

delegate?.receivedUVC?(data: stringValue)

但后来我问自己为什么要在协议中定义两种不同的方法?在协议中定义一个强制(非可选)方法,在两个UIViewControllers中实现它,并在BluetoothManager.swift中调用此方法。然后最后一次设置委托获取数据。如果两个ViewControllers同时存在,则BluetoothManager需要delegate1和delegate2以及对两个代理的方法调用。