5

我正在尝试使用 CoreBluetooth 框架,并且我创建了一个帮助器类 (btHelper) 以使代码更易于维护等。

问题是,在这个帮助类中,委托方法不再像原来那样被调用,当所有东西都被压缩到大类中时。是的,我已经在助手类的 .h 中设置了委托方法,是的,我已经将对象 CBCentralManager 委托设置为 self。我所做的几乎所有事情都和在一个班级里时一样。我相信它与主线程有关,但我在这方面的经验很少。

具体来说,我想要调用的委托方法是

-(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];

}
4

2 回答 2

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
于 2013-12-21T13:41:12.727 回答
0

确保您的 btHelper.m 采用 CBCentralManagerDelegate 协议。

@interface btHelper () <CBCentralManagerDelegate> {}

在您的上述情况下,很可能您没有使用该方法得到任何错误:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

因为从几个版本开始,编译器不再要求您声明任何私有方法(在 .m 文件的接口部分中)。

希望这可以帮助。

于 2013-12-18T10:13:16.043 回答