如何符合CBCentralManagerDelegate协议?

6

我正在尝试初始化一个中央管理器实例,以便使用蓝牙连接创建应用程序。

以下是我的其中一部分代码:

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

我遇到了一个错误:
“类型'ViewController -> () -> ViewController!'不符合协议'CBCentralManagerDelegate'”
该协议要求的唯一方法是centralManagerDidUpdateState(),我已经添加了该方法,为什么还会出现错误?
5个回答

5

错误信息有点误导人,指向了实际问题的另一个方向。问题在于你正在初始化存储属性时访问self,这样是不允许的。

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


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

你需要在你的类中至少提供这个函数:

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

那就是我的问题!非常感谢你。 - Carlos Zinato

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

1
我实际上找到了一个巧妙的解决方法,只要你已经找到了其他人使用CBCentralManagerDelegate的开源项目。(而且很容易找到一些使用CBCentralManagerDelegate的开源项目)
假设在开源项目中,“ViewController.swift”使用了CBCentralManagerDelegate。在您的项目中,您需要“TESTViewController.swift”使用CBCentralManagerDelegate。
现在您需要做的就是:
第1步,将(即拖动)来自开源项目的ViewController.swift复制到您的项目中
第2步,删除刚刚拖到您的项目中的ViewController.swift中的所有行。
第3步,如果需要,请将其从ViewController.swift重命名为TESTViewController.swift,并重命名类名。
第4步,现在您可以编写自己的代码“class TESTViewController:UIViewController,CBCentralManagerDelegate {...}”
是的,这可能有点傻,但它确实可以快速为我的项目工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接