2016-08-17 20 views
1

Swift言語(v2.2)を使用してXCode(v7.3)で作業を開始しました。ターゲットBLEに接続する単一ページアプリケーションを作成しようとしていますボタンを押してBluetoothManagerDelegateクラス内のViewControllerボタンにアクセス

私は、以下のウェブサイト上のコアのBluetoothのフレームワークの簡単なチュートリアルを追っ:これらのクラス定義を挿入してのインスタンスを宣言した後

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() 

:私は以下のクラス構造を作成していたhttp://hatemfaheem.blogspot.com/2014/12/how-would-you-scan-for-nearby-ble.html

私のViewController.swiftファイルのViewControllerクラス内のBLEManagerクラスでは、アプリケーションを実行しているときに私のiPhoneでBluetoothのオンとオフを切り替えると、コンソールに「Powered On」と「Powered Off」の文字列が表示されます。

上記のコードで "ble_show()"と "ble_hide"という名前の関数を呼び出すと、エラーが発生するという問題があります(コメントアウトされている理由です)。私は、これらの関数が最も重要なViewControllerクラスのメンバであるため、ネストされたクラスBLEHandlerからそれらの関数を呼び出すことができないという問題があると想定しています。

ble_show()およびble_hide()関数は、ボタンに「隠し」フラグを設定するだけで、ユーザーに表示されます。これらのボタンは、ユーザーがBluetoothをオンにしている場合にのみ使用可能になります。したがって、BLEHandlerクラスは、ViewControllerクラスで宣言されているこれらのボタンにアクセスする必要がありますが、その方法を理解していないようです。私はすべての関数の宣言とUIButton宣言をBLEHandlerクラスの中で動かそうとしましたが、Xcodeはそれを本当に気に入らなかったのです。

私の問題の1つは、Swift、XCode、およびCore Bluetoothフレームワークをすべて同時に学習しているため、誰かが私ができることをできるだけ徹底的に試していることを説明することができれば、 。私は、main()(現在ViewControllerクラスを扱っている方法です)としてクラスを使用するのではなく、単純なmain()関数を使って環境をプログラミングするのに使います。

私が正しく理解している場合、CBCentralManagerDelegateは、Bluetoothステータスの変更が発生するたびに、自分のCentralManagerDidUpdateState()メンバー関数を呼び出すイベントに自分のコードの一部を登録しています。しかし、これらのイベントが発生したときに何かを行うように私のViewControllerにどのように伝えることができますか?

答えて

1

ビューマネージャからBluetoothマネージャを切り離すと(これは良い設計です)、ビューコントローラのアイテムを直接更新することはできません。 NSNotificationまたはプロトコル/デリゲートを使用して、ビューコントローラにBluetooth状態の変更を通知できます。

Bluetoothイベントに関心のある多くのオブジェクトが存在する可能性があるので、この場合はNSNotificationを使用します。あなたのViewControllerクラスで

、あなたが特定の通知のオブザーバを登録することができます。

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

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

だから私は、コードあなたを追加しましたいくつかのエラーが発生します。私は '!' 'userInfo 'の後ろに' if let status = notification.userInfo ["statusString"]?文字列{'であり、' aDict '(未解決の識別子の使用)という行に 'notificationCenter.postNotificationName(" bleStateChange "、object:nil、userInfo:aDict)'という問題があります。私はこのコードで何が起こっているのか本当に理解していないので、ここで何が起こっているのかについていくつかの詳細を提示すると役に立ちます – marco

+0

私は今それを理解したと思います。私はそれが未使用の辞書であることを知った後、私は 'aDict'をuserInfo(上記の行で宣言されている)に置き換えました。そして今、私はbluetoothChanged()funcのswitch文を通して必要な振る舞いを得ることができました。お手伝いありがとう。 – marco

+0

申し訳ありませんが、私のプレイグラウンドからのカット/ペーストエラーでした。 – Paulw11

関連する問題