2016-08-17 3 views
1

Swift 언어 (v2.2)를 사용하여 XCode (v7.3)로 작업하기 시작했으며 대상 BLE에 연결할 단일 페이지 앱을 작성하려고합니다. 버튼을 눌러서 http://hatemfaheem.blogspot.com/2014/12/how-would-you-scan-for-nearby-ble.htmlBluetoothManagerDelegate 클래스 내의 ViewController 버튼에 액세스

나 다음 클래스 구조를 생성했다 : 그 클래스 정의를 삽입의 인스턴스를 선언 한 후

class BLEManager{ 
    var centralManager:CBCentralManager 
    var bleHandler:BLEHandler 
    init() { 
     self.bleHandler = BLEHandler() 
     self.centralManager = CBCentralManager(delegate: self.bleHandler, queue: nil 
    } 
} 

class BLEHandler : NSObject, CBCentralManagerDelegate { 
    override init() { 
     super.init() 
    } 
    func CentralManagerDidUpdateState(central: CBCentralManager) { 
     var status:String 
     switch(central.state) { 
     case .PoweredOn 
      status = "Powered On" 
      //ble_show() 
     case .PoweredOff 
      status = "Powered Off" 
      //ble_hide() 
     }//Note: several cases have been omitted to reduce length 
     print(status) 
    } 
} 

var bleManager = BLEManager() 

나는 다음 웹 사이트에서 코어 블루투스 프레임 워크에 관한 짧은 튜토리얼을 따라 내 ViewController.swift 파일의 ViewController 클래스에있는 BLEManager 클래스에서 응용 프로그램을 실행하는 동안 내 iPhone에서 Bluetooth를 켜고 끄는 것처럼 콘솔에 "Powered On"및 "Powered Off"라는 문자열이 표시됩니다.

위의 코드에서 "ble_show()"및 "ble_hide"라는 함수를 호출 할 때 오류가 발생합니다 (주석 처리 된 이유입니다). 이 함수는 중요한 ViewController 클래스의 멤버이기 때문에 문제가 있다고 가정하고 중첩 클래스 내부에서 이러한 함수를 호출 할 수 없습니다. BLEHandler.

ble_show() 및 ble_hide() 함수는 단추에 "숨겨진"플래그를 설정하여 사용자에게 표시합니다. 사용자가 블루투스를 켰을 때만이 버튼을 사용할 수있게하려고합니다. 그래서 BLEHandler 클래스는 어떻게 든 ViewController 클래스에서 선언 된 이러한 버튼에 액세스해야하지만, 그 일을하는 방법을 이해하지 못하는 것 같습니다. BLEHandler 클래스 내에서 모든 함수 선언과 UIButton 선언을 옮겨 보았습니다.하지만 Xcode는 그렇게했을 때 정말 좋아하지 않았습니다.

일부 문제는 Swift, XCode 및 Core Bluetooth 프레임 워크에 대해 동시에 배우고 있기 때문에 가능한 한 철저히 시도하고있는 것을 달성하는 방법을 설명 할 수 있다면 매우 도움이 될 것입니다. . 나는 주() (현재 ViewController 클래스를 다루고있는 방법)로 클래스를 사용하는 대신에 간단한 main() 함수로 환경을 프로그래밍하는 데 익숙하다.

올바르게 이해하면 CBCentralManagerDelegate는 블루투스 상태가 변경 될 때마다 내 CentralManagerDidUpdateState() 멤버 함수를 호출하는 이벤트에 내 코드 일부를 등록합니다. 하지만 어떻게 이러한 이벤트가 발생할 때 뭔가를 내 ViewController 말할 수 있습니까?

답변

1

좋은 디자인 인보기 컨트롤러에서 Bluetooth 관리자를 분리하면보기 컨트롤러에서 항목을 직접 업데이트 할 수 없습니다. NSNotification이나 프로토콜/위임을 사용하여 뷰 컨트롤러에 블루투스 상태 변경을 알릴 수 있습니다.

블루투스 이벤트에 관심이 많은 개체가있을 수 있으므로이 경우 NSNotification을 사용합니다. 당신의 ViewController 클래스에서

, 특정 통지 관찰자를 등록 할 수 있습니다 :

func CentralManagerDidUpdateState(central: CBCentralManager) { 
    var status:String 
    switch(central.state) { 
     case .PoweredOn 
      status = "Powered On" 
      //ble_show() 
     case .PoweredOff 
      status = "Powered Off" 
      //ble_hide() 
    }//Note: several cases have been omitted to reduce length 
    print(status) 
    let notificationCenter = NSNotificationCenter.defaultCenter() 
    let userInfo = ["statusString":"powered off","centralState":central.state.rawValue] as [String:AnyObject] 
    notificationCenter.postNotificationName("bleStateChange", object: nil, userInfo: userInfo) 
} 
+0

그래서 코드를 당신에게 추가 한 : 당신의 BLEManager 당신은 통지를 게시 할 필요

override func viewDidLoad() { super.viewDidLoad() let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: #selector(ViewController.bluetoothChanged(_:)), name: "bleStateChange", object: nil) } @objc func bluetoothChanged(notification: NSNotification) { if let status = notification.userInfo["statusString"] as? String { print("Bluetooth status = \(status)") } } 

을 제공되며 몇 가지 오류가 발생합니다. 나에게 '!' 'userInfo'다음에 :'if let status = notification.userInfo [ "statusString"]? String {'그리고 그것은 'aDict'(미해결 식별자 사용)라는 줄에'notificationCenter.postNotificationName ("bleStateChange", object : nil, userInfo : aDict)'문제가 있습니다.나는이 코드에서 무슨 일이 벌어지고 있는지 정말로 이해하지 못하기 때문에 여기에 무슨 일이 일어나고 있는지에 대한 세부 사항을 제공하는 것이 도움이 될 것입니다. – marco

+0

나는 그것을 지금 생각했다고 생각합니다. 사용하지 않는 사전이었고 이제는 bluetoothChanged() func의 switch 문을 통해 원하는 동작을 얻을 수있게 된 후 'aDict'를 userInfo (위의 줄에서 선언)로 바꿨습니다. 도와 주셔서 감사합니다. – marco

+0

죄송합니다. 내 놀이터에서 잘라 내기/붙여 넣기 오류가 발생했습니다. – Paulw11

관련 문제