如何符合CBCentralManagerDelegate协议?

时间:2015-01-25 06:55:18

标签: ios swift bluetooth

我正在尝试初始化中央管理器实例,以创建具有蓝牙连接功能的应用。

这是我的代码的一部分:

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

我收到错误:

  

“输入'ViewController - >() - > ViewController!'不符合协议'CBCentralManagerDelegate'

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

5 个答案:

答案 0 :(得分:5)

创建中央管理器时,中央管理器调用其委托对象的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
    }
}

答案 1 :(得分:4)

错误消息有点欺骗,并指出您远离实际问题。问题是您正在初始化程序中访问存储属性的self,您不能这样做。

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

答案 2 :(得分:1)

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

让我们在开源项目中说," ViewController.swift"使用CBCentralManagerDelegate。 在您的项目中,您需要" TESTViewController.swift"使用CBCentralManagerDelegate。

现在你需要做的就是

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

步骤2,删除ViewController.swift中刚刚拖到项目中的所有行。

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

步骤4,现在您可以编写自己的代码了 "类TESTViewController:UIViewController,CBCentralManagerDelegate {...}"

是的,这可能很愚蠢,但它确实对我的项目很快起作用。

答案 3 :(得分:1)

代码不符合CBCentralManagerDelegate,因为方法" func centralManagerDidUpdateState(central:CBCentralManager!)"需要添加到CBCentralManager类型的类中。不是视图控制器类型。您必须创建一个CBCentralManager类型的新类。以下是我在上面提到的问题的解决方案:

//
//  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")
       }
    }
 }

答案 4 :(得分:1)

您至少需要在班级中提供此功能:

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