color buttons ios objective-c delegates core-bluetooth cbcentralmanager

ios - buttons - ionic text



Delegado no llamado en diferentes hilos (2)

Asegúrese de que su btHelper.m adopte el protocolo CBCentralManagerDelegate.

@interface btHelper () <CBCentralManagerDelegate> {}

En tu caso anterior, lo más probable es que no hayas tenido ningún error con el método:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

ya que a partir de algunas versiones atrás, el compilador dejó de exigirle que declare algún método privado (en la sección de interfaz de su archivo .m).

Espero que esto ayude.

Estoy tratando de usar el framework CoreBluetooth y he creado una clase de ayuda (btHelper) para hacer que el código sea más fácil de mantener y tal.

El problema es que en esta clase de ayuda, los métodos de delegado ya no se llaman como lo eran originalmente cuando todo se incluía en una clase grande. Sí, he configurado el método delegado en .h de la clase auxiliar y sí, he configurado el objeto delegado CBCentralManager en self. Casi hice todo igual que cuando todo estaba en una clase. Creo que tiene algo que ver con el hilo principal, pero tengo muy poca experiencia en esto.

Específicamente, el método de delegado que quiero llamar es

-(void)centralManagerDidUpdateState:(CBCentralManager *)central

¿Puede alguien decirme qué debo hacer para que las llamadas de delegado funcionen como deberían en esta clase de ayuda? ¡Gracias!

La siguiente es la clase PrimaryViewController y la clase btHelper

btHelper.m

-(void) activateBluetooth { self.manager= [[CBCentralManager alloc] initWithDelegate:self queue:nil]; } - (void)centralManagerDidUpdateState:(CBCentralManager *)central { //DELEGATE METHOD THAT NEVER GETS CALLED. SHOULD BE CALLED AS SOON AS self.manager is initiated self.isAvailable=FALSE; switch (central.state) { case CBCentralManagerStatePoweredOff: NSLog(@"CoreBluetooth BLE hardware is powered off"); break; case CBCentralManagerStatePoweredOn: NSLog(@"CoreBluetooth BLE hardware is powered on and ready"); self.isAvailable=TRUE; break; case CBCentralManagerStateResetting: NSLog(@"CoreBluetooth BLE hardware is resetting"); break; case CBCentralManagerStateUnauthorized: NSLog(@"CoreBluetooth BLE state is unauthorized"); break; case CBCentralManagerStateUnknown: NSLog(@"CoreBluetooth BLE state is unknown"); break; case CBCentralManagerStateUnsupported: NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform"); break; default: break; } }

PrimaryViewController.m

-(IBAction)connect { btHelper *bluetoothManager= [[btHelper alloc]init]; [bluetoothManager activateBluetooth]; }


Tu instancia de ayuda es una variable local en el método -connect . Entonces, ARC lo libera (y la instancia de CBCentralManager) antes de que pueda recibir los métodos de delegado. Haga de su ayudante una variable de instancia (o propiedad) de PrimaryViewController, y esto solucionará su problema.

@interface PrimaryViewController : UIViewController { // BTHelper instead of btHelper, to follow naming convention BTHelper *_bluetoothManager; } @end @implementation PrimaryViewController -(IBAction)connect { // FIXME: this don''t check if _bluetoothManager is already instantiated _bluetoothManager = [[BTHelper alloc] init]; [_bluetoothManager activateBluetooth]; } @end