簡體   English   中英

如何符合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!) { 
}

我收到一個錯誤:

“鍵入'ViewController->()-> ViewController!' 不符合協議“ CBCentralManagerDelegate”

該協議所需的唯一方法是我添加的centralManagerDidUpdateState() ,為什么會出現錯誤?

創建中央管理器時,中央管理器將調用其委托對象的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
    }
}

該錯誤消息有點欺騙,使您遠離實際問題。 問題是您正在初始化器中訪問存儲屬性的self ,而您不能這樣做。

一種解決方法是簡單地聲明屬性而不對其進行初始化,然后將對變量的賦值移動到某個位置,例如您的視圖控制器的初始化程序,或視圖控制器的生命周期方法之一,例如viewDidLoad。

只要您已經找到其他使用CBCentralManagerDelegate的開源項目,我實際上找到了一個棘手的解決方法。 (而且不難發現一些使用CBCentralManagerDelegate的開源項目)

可以說在開源項目中,“ ViewController.swift”使用CBCentralManagerDelegate。 在您的項目中,需要“ TESTViewController.swift”才能使用CBCentralManagerDelegate。

現在您要做的就是

步驟1,將ViewController.swift(即來自開源項目)復制(即拖動)到項目中

步驟2,刪除剛剛拖到項目中的ViewController.swift中的所有行。

步驟3,如果需要,將其從ViewController.swift重命名為TESTViewController.swift,並同時重命名類名。

步驟4,現在您可以編寫自己的代碼“ TESTViewController類:UIViewController,CBCentralManagerDelegate {...}”

是的,這可能很愚蠢,但是確實可以很快地為我的項目工作。

該代碼不符合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")
       }
    }
 }

您至少需要在課堂上提供以下功能:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM