如何符合CBCentralManagerDelegate协议?

我正尝试初始化一个中央pipe理器实例来制作一个具有蓝牙连接function的应用程序。

这是我的代码的一部分:

class ViewController: UIViewController, CBCentralManagerDelegate { var myCentralManager = CBCentralManager(delegate: self, queue: nil) //error on this line func centralManagerDidUpdateState(central: CBCentralManager!) { } 

我收到一个错误:

“Type'ViewController – >() – > ViewController!' 不符合协议'CBCentralManagerDelegate'

协议要求的唯一方法是我添加的centralManagerDidUpdateState() ,为什么我会得到一个错误?

错误信息是一个有点欺骗,并指出你远离实际问题。 问题是你正在初始化器访问self的存储属性,你不能这样做。

一种解决方法是简单地声明属性而不初始化它,然后将赋值移动到某个地方,比如视图控制器的初始化程序或视图控制器的其中一个生命周期方法,比如viewDidLoad。

当您创build中央pipe理器时,中央pipe理器调用其委托对象的centralManagerDidUpdateState方法。 所以你必须实现这个委托方法,以确保支持蓝牙低功耗,并可以使用中央设备。 如下所示:

 func centralManagerDidUpdateState(central: CBCentralManager!){ println("CentralManager is initialized") switch central.state{ case CBCentralManagerState.Unauthorized: println("The app is not authorized to use Bluetooth low energy.") case CBCentralManagerState.PoweredOff: println("Bluetooth is currently powered off.") case CBCentralManagerState.PoweredOn: println("Bluetooth is currently powered on and available to use.") default:break } } 

实际上,我发现一个棘手的解决方法,只要你已经find了一些其他的使用CBCentralManagerDelegate的开源项目。 (而且不难find一些使用CBCentralManagerDelegate的开源项目)

比方说在开源项目中,“ViewController.swift”使用CBCentralManagerDelegate。 在你的项目中,你需要使用“TESTViewController.swift”来使用CBCentralManagerDelegate。

现在你需要做的就是

步骤1,将ViewController.swift(来自开源项目)复制(即拖动)到您的项目中

第2步,删除ViewController.swift中的所有行,只是拖动到您的项目。

步骤3,如果需要,将其从ViewController.swift重命名为TESTViewController.swift,并重命名类名称。

第4步,现在你可以写你自己的代码“class TESTViewController:UIViewController,CBCentralManagerDelegate {…}”

是的,这可能是愚蠢的,但它确实很快适用于我的项目。

代码不符合CBCentralManagerDelegate,因为需要将方法“func centralManagerDidUpdateState(central:CBCentralManager!)”添加到types为CBCentralManager的类中。 不是视图控制器types。 您必须创build一个新的CBCentralManager类。 这是我对上面引用的问题的解决scheme:

 // // ViewController.swift // BLECentral // // Created by Sophronis Mantoles on 11/17/15. // Copyright © 2015 Sophronis Mantoles. All rights reserved. // import UIKit import CoreBluetooth class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } @IBOutlet var statusLabel: UILabel! var bleManager: BLEManager! override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func showStatus(sender: AnyObject) { func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertismentData: [NSObject : AnyObject]!, RSSI: NSNumber!) { statusLabel.text = ("\(peripheral.name) : \(RSSI) dBm") } } } class BLEManager { var centralManager : CBCentralManager! var bleHandler : BLEHandler // delegate init() { self.bleHandler = BLEHandler() self.centralManager = CBCentralManager(delegate: self.bleHandler, queue: nil) } } class BLEHandler : NSObject, CBCentralManagerDelegate { override init () { super.init() } func centralManagerDidUpdateState(central: CBCentralManager){ switch (central.state) { case.Unsupported: print("BLE is not supported") case.Unauthorized: print("BLE is unauthorized") case.Unknown: print("BLE is Unknown") case.Resetting: print("BLE is Resetting") case.PoweredOff: print("BLE service is powered off") case.PoweredOn: print("BLE service is powered on") default: print("default state") } } } 

你至less需要在你的课堂上提供这个function:

 func centralManagerDidUpdateState(_ central: CBCentralManager) { <#code#> }