0

我正在开发蓝牙 LE 应用程序。在我的ViewController中,如果我按下操作按钮,我有一个操作按钮(搜索),可用的 BLE 设备名称列表显示在工作正常的表格视图中。现在我想访问TableViewCell(如果我单击一个设备名称,则支持服务正在填充另一个ViewController)以获取蓝牙低功耗设备支持的服务。我的问题是如何访问TableViewCell(填充)中的设备名称以及如何从 BLE 获取支持的服务(例如警报、TxPwr、电池)。如果我单击一个单元格(设备名称),那么我想知道列表支持的服务。给我一个想法。设备是我的可变数组。我的问题是如何填充TableViewCell到我的另一个ViewController...

 -(void)viewDidLoad 
  { 
     [super viewDidLoad]; 
     peripheralManager=[[PeripheralManager alloc]init]; 
     self.label.text = @"" 
     [self.deviceTable reloadData]; 
     device=[[NSMutableArray alloc]init];     
  } 

表视图

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [device count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
   static NSString *CellIdentifier=@"Cell"; 
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
   if(cell==nil) 
   { 
      cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
   } 

   cell.textLabel.text=[device objectAtIndex:indexPath.row]; 
   cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton; 
   return cell; 
} 


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[self performSegueWithIdentifier:@"TableDetails" sender:[device objectAtIndex:indexPath.row]];
//NSString *deviceName = [device objectAtIndex:indexPath.row];
//secondViewController *svController=[[secondViewController alloc] initWithNibName:@"SecondView" bundle:[NSBundle mainBundle]];
    //svController.deviceName=deviceName;
    //[self.navigationController pushViewController:svController animated:YES];
    // svController=nil;
  }
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
       {
if ([segue.identifier isEqualToString:@"TableDetails"]) {
    [segue.destinationViewController setDeviceName:(NSString *)sender];
       }
 }
4

1 回答 1

1

我想您从选定的(用户点击的)表格视图单元中需要/想要的只是设备名称来自名为“设备”的可变数组

如果'填充'意味着让新加载的视图控制器,'TableDetails'的目标视图控制器知道设备名称,

  • 将设备名称传递给发送者:performSegueWithIdentifier 的参数:发送者:
  • 设备名称可以来自 cell.textLabel.text 或 [device objectAtIndex:indexPath.row],因为您已经使用不同的方法完成了
  • 假设新加载的视图控制器的名称有一个类名DeviceDetailViewController,例如
  • 添加@property (nonatomic, strong) NSString *deviceName; 到DeviceDetailViewController

  • 覆盖 -prepareForSegue:sender: 执行 segue 的视图控制器的方法,并将设备名称作为 sender 参数传递给 segue 的目标视图控制器,方式如下:

  • 如果您在 Storyboard 设计中正确配置了destinationViewController @property,则拥有Storyboard 新加载的DeviceDetailViewController 实例,例如为segue 目标视图控制器提供新的类名

  • setDeviceName: 方法通过@property (...) deviceName 的声明神奇地可用;如果您使用的是最新版本的 Xcode,请声明

DeviceDetailViewController

@interface DeviceDetailViewController : UITableViewController
@property (nonatomic, strong) NSString *deviceName;
@end

表视图

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
    if ([segue.identifier isEqualToString:@"TableDetails"]) {
        [segue.destinationViewController setDeviceName:(NSString *)sender];
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{   
    // UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath]; 
    [self performSegueWithIdentifier:@"TableDetails" sender:[device objectAtIndex:indexPath.row]]; 
} 

现在,您可以在类实现中使用 DeviceDetailViewController 的 deviceName @property 做任何您想做的事情。

于 2012-10-18T05:40:08.427 回答