如何遵守 CBCentralManagerDelegate 协议?
How to conform to CBCentralManagerDelegate Protocol?
我正在尝试初始化中央管理器实例以制作具有蓝牙连接的应用程序。
这是我的代码的一部分:
class ViewController: UIViewController, CBCentralManagerDelegate {
var myCentralManager = CBCentralManager(delegate: self, queue: nil) //error on this line
func centralManagerDidUpdateState(central: CBCentralManager!) {
}
我收到一个错误:
"Type 'ViewController -> () -> ViewController!' does not conform to protocol 'CBCentralManagerDelegate'
协议唯一需要的方法是我添加的centralManagerDidUpdateState()
,为什么会报错?
错误消息有点欺骗性,会让您远离实际问题。问题是您在初始化程序中访问 self
以存储 属性,您不能这样做。
一种解决方法是简单地声明 属性 而不对其进行初始化,然后将对变量的赋值移动到某个地方,例如视图控制器的初始化器或视图控制器的生命周期方法之一,例如 viewDidLoad .
我实际上找到了一个棘手的解决方法,只要您已经找到其他一些使用 CBCentralManagerDelegate 的开源项目。 (而且不难发现一些使用CBCentralManagerDelegate的开源项目)
假设在开源项目中,"ViewController.swift" 使用了 CBCentralManagerDelegate。
在您的项目中,您需要 "TESTViewController.swift" 才能使用 CBCentralManagerDelegate。
现在您需要做的就是
第 1 步,将 ViewController.swift(来自开源项目)复制(即拖动)到您的项目
第 2 步,删除刚刚拖到您的项目中的 ViewController.swift 中的所有行。
第 3 步,如果需要,将其从 ViewController.swift 重命名为 TESTViewController.swift,并重命名 class 名称。
第四步,现在可以自己写代码了
"class TESTViewController: UIViewController, CBCentralManagerDelegate {...} "
是的,这可能很愚蠢,但它确实对我的项目很有效。
创建中央管理器时,中央管理器调用其委托对象的 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
}
}
该代码不符合CBCentralManagerDelegate,因为方法"func centralManagerDidUpdateState(central: CBCentralManager!)"需要添加到类型为CBCentralManager的class。不是视图控制器类型。您必须创建一个新的 class 类型的 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")
}
}
}
您至少需要在 class:
中提供此功能
func centralManagerDidUpdateState(_ central: CBCentralManager) {
<#code#>
}
我正在尝试初始化中央管理器实例以制作具有蓝牙连接的应用程序。
这是我的代码的一部分:
class ViewController: UIViewController, CBCentralManagerDelegate {
var myCentralManager = CBCentralManager(delegate: self, queue: nil) //error on this line
func centralManagerDidUpdateState(central: CBCentralManager!) {
}
我收到一个错误:
"Type 'ViewController -> () -> ViewController!' does not conform to protocol 'CBCentralManagerDelegate'
协议唯一需要的方法是我添加的centralManagerDidUpdateState()
,为什么会报错?
错误消息有点欺骗性,会让您远离实际问题。问题是您在初始化程序中访问 self
以存储 属性,您不能这样做。
一种解决方法是简单地声明 属性 而不对其进行初始化,然后将对变量的赋值移动到某个地方,例如视图控制器的初始化器或视图控制器的生命周期方法之一,例如 viewDidLoad .
我实际上找到了一个棘手的解决方法,只要您已经找到其他一些使用 CBCentralManagerDelegate 的开源项目。 (而且不难发现一些使用CBCentralManagerDelegate的开源项目)
假设在开源项目中,"ViewController.swift" 使用了 CBCentralManagerDelegate。 在您的项目中,您需要 "TESTViewController.swift" 才能使用 CBCentralManagerDelegate。
现在您需要做的就是
第 1 步,将 ViewController.swift(来自开源项目)复制(即拖动)到您的项目
第 2 步,删除刚刚拖到您的项目中的 ViewController.swift 中的所有行。
第 3 步,如果需要,将其从 ViewController.swift 重命名为 TESTViewController.swift,并重命名 class 名称。
第四步,现在可以自己写代码了 "class TESTViewController: UIViewController, CBCentralManagerDelegate {...} "
是的,这可能很愚蠢,但它确实对我的项目很有效。
创建中央管理器时,中央管理器调用其委托对象的 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
}
}
该代码不符合CBCentralManagerDelegate,因为方法"func centralManagerDidUpdateState(central: CBCentralManager!)"需要添加到类型为CBCentralManager的class。不是视图控制器类型。您必须创建一个新的 class 类型的 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")
}
}
}
您至少需要在 class:
中提供此功能func centralManagerDidUpdateState(_ central: CBCentralManager) {
<#code#>
}