IOS:当用户选择行时,从表视图连接外围设备

Posted

技术标签:

【中文标题】IOS:当用户选择行时,从表视图连接外围设备【英文标题】:IOS:Connect peripheral device from table view when user select row 【发布时间】:2014-10-14 05:57:09 【问题描述】:

我正在开发 corebluetooth 应用程序。当我开始在 tableview 中发现设备并且当我使用 do connect 委托方法在索引路径中选择行中选择要连接的设备时,我得到控制台中的错误,我用于发现和连接设备的代码是下面指定

用于发现外围设备

 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:  
    (CBPeripheral 
    *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
    

    self.discoveredPeripheral = peripheral;
    _logData = [NSString stringWithFormat:@"Did discover peripheral. peripheral: %@ rssi: %@,  
    `enter code here`UUID: %@   advertisementData: %@ ", peripheral, RSSI, peripheral.UUID,  
      advertisementData];
    NSLog(@"%@",_logData);


 [_periferalDevices addObject:peripheral.name];
 [_tableView reloadData];


 

用于连接外围设备

  - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral   

   *)peripheral
  
   peripheral.delegate = self;

  [self.discoveredPeripheral discoverServices:nil];
   NSLog(@"Peripheral Connected");
   NSLog(@" started  time is %@",_timestring);
  // Stop scanning
 //[self.centralManager stopScan];
 NSLog(@"Scanning stopped");
  [self.data setLength:0];
[peripheral discoverServices:nil];


  [peripheral discoverServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]]];
  

我的困惑是在下面的代码中,在选定行中选择特定外围设备后,我们必须编写什么代码才能在表格视图中连接发现的设备。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   
    *)indexPath
    
   if (_periferalDevices.count >0 )
  
    CBPeripheral *peripheral =[_periferalDevices objectAtIndex:indexPath.row];
    _discoveredPeripheral = peripheral;
    NSLog(@"selected peripheral - %@",peripheral);
   [self.centralManager connectPeripheral:peripheral options:nil];
    [_periferalDevices removeObject:peripheral];
    NSLog(@"selected peripheral state - %d",peripheral.state);

     [tableView reloadData];

   NSString *strID = [NSString   stringWithFormat:@"%@",_discoveredPeripheral.identifier];
     strID = [strID substringFromIndex: [strID length] - 20];
     UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"conected" message:@""  
      delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
    [alert show];

 

  
  i am getting the errors as specified below
 2014-10-14 11:36:46.697 Bluetooth_iph[1705:368603] selected peripheral - MetaWatch 56
 2014-10-14 11:36:50.385 Bluetooth_iph[1705:368603] -[__NSCFString identifier]: unrecognized    
 selector sent to instance 0x14e67190
 2014-10-14 11:36:50.387 Bluetooth_iph[1705:368603] *** Terminating app due to uncaught   
 exception 'NSInvalidArgumentException', reason: '-[__NSCFString identifier]: unrecognized    
 selector sent to instance 0x14e67190'

  *** First throw call stack:

  (0x28b47f87 0x36576c77 0x28b4d37d 0x28b4b259 0x28a7cd68 0x28818c7d 0xfb6db 0x2c0dcc57  
  0x2c18e2d7 0x2c040449 0x2bfbc30f 0x28b0e845 0x28b0bf29 0x28b0c32b 0x28a59db1 0x28a59bc3  
   0x2fdbc051 0x2c025a31 0xfc57d 0x36b12aaf)

    libc++abi.dylib: terminating with uncaught exception of type NSException 

我已经给了他上面的代码,但是连接外围代理方法不起作用。请帮助我提前谢谢

【问题讨论】:

哪一行给你错误。它说您正在访问 NSString 上的标识符属性(您不能这样做),所以您在某个地方混淆了外围设备和字符串 添加异常断点或查看堆栈跟踪以查看哪一行有问题。我在您在此处显示的代码中看不到问题。 你把[_periferalDevices addObject:peripheral.name];改成[_periferalDevices addObject:peripheral];了吗? 我也改变了这一点,但目的是得到如下错误..'NSInvalidArgumentException',原因:'-[CBPeripheral isEqualToString:]: unrecognized selector sent to instance 0x175a3ad0' 您的数组现在包含CBPeripherals,而不是字符串,因此您需要在该行中使用peripheral.identifier 【参考方案1】:

您应该添加peripheral 对象并在cellForRowAtIndexPath 中检索名称,而不是将peripheral.name 添加到periferalDefices 数组中。那么你的didSelectRowAtIndexPath 就会和你写的一样

【讨论】:

我能够获取设备的名称,但无法连接到它,而我正在提供 [self.centralManager connectPeripheral:peripheral options:nil];在代码中 我已经更新了错误代码,请在上面找到并帮助谢谢

以上是关于IOS:当用户选择行时,从表视图连接外围设备的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 从表视图控制器获取值并将其发送到另一个表视图控制器

在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开

从表视图中删除特定行

如何以编程方式将数据从表视图控制器传递到另一个控制器? [复制]

从表视图导航到表视图再到表视图 (iOS)

从表视图中删除行