5

Я пытаюсь использовать каркас CoreBluetooth, и я создал вспомогательный класс (btHelper), чтобы сделать код более удобным и удобным.Делегат не вызвал другую тему

Проблема заключается в том, что в этом вспомогательном классе методы делегатов больше не вызываются, как они были изначально, когда все было снесено в большой класс. Да, я установил метод делегирования в .h из класса-помощника и да, я установил объект CBCentralManager делегировать себя. Я почти все сделал так же, как когда все было в одном классе. Я считаю, что это имеет какое-то отношение к основной теме, но у меня очень мало опыта в этом.

В частности, метод делегата, который я хочу назвать это

-(void)centralManagerDidUpdateState:(CBCentralManager *)central 

Может кто-нибудь пожалуйста, скажите мне, что я должен сделать, чтобы получить делегатом призвание работает, как это должно быть в этом вспомогательном классе? Спасибо!

Ниже класс PrimaryViewController и класс 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]; 

} 
+0

Вы уверены, что ваш менеджер bluetooth на самом деле что-то делает? Например. путем вызова 'scanForPeripheralsWithServices'? – Macondo2Seattle

+0

Можете ли вы установить контрольную точку в своем IBAction и посмотреть, не срабатывает ли она? – Spectravideo328

+0

@BlackRider Инициирование CBCentralManager автоматически должно вызвать метод делегирования centralManagerDidUpdateState. Этот метод имеет решающее значение для определения состояния Bluetooth (например, поддерживается ли Bluetooth LTE на устройстве). Оттуда, и если bluetooth включен, можно вызвать метод, например scanForPeripheralWithServices – Teddy13

ответ

13

Экземпляр помощника является локальной переменной в методе -connect. Таким образом, ARC освобождает его (и экземпляр CBCentralManager), прежде чем вы сможете получить методы делегата. Сделайте свой помощник переменной экземпляра (или свойства) PrimaryViewController, и это устранит вашу проблему.

@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 
+0

Вы правы! такая простая ошибка! Спасибо! – Teddy13

+0

Вышеупомянутое решение? Я столкнулся с этой проблемой сейчас – sim

0

Убедитесь, что btHelper.m принять Протокол CBCentralManagerDelegate.

@interface btHelper() <CBCentralManagerDelegate> {} 

В вашем случае выше, скорее всего, вы не получите никаких ошибок с помощью метода:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 

так, как в несколько версий назад, компилятор перестал требовать, что вы объявляете какие-либо частные методы (в разделе интерфейса вашего файла .m).

Надеюсь, это поможет.

+0

Спасибо за ответ! Я объявлял протокол CBCentralManagerDelegate. Что касается остальной части вашего ответа, я не вижу, как это помогает в этой ситуации? Это вызвало, когда у меня было все, что было в одном классе, это нужно назвать, несмотря ни на что. Возможно, мне не хватает вашей точки (скорее всего, случай).Если я, пожалуйста, объясните еще кое-что? Спасибо – Teddy13

Смежные вопросы