如何将tableviewCell填充到另一个viewcontroller?

时间:2012-10-18 03:29:21

标签: objective-c ios ios5 uitableview

我正在开发蓝牙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];     
  } 

的TableView

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 将设备名称传递给sender:performSegueWithIdentifier:sender:
  • 的参数
  • 设备名称可能来自cell.textLabel.text或[device objectAtIndex:indexPath.row],因为您已经使用其他方法完成了
  • 假设新加载的视图控制器的名称具有类名 DeviceDetailViewController ,例如
  • 添加@property(非原子,强)NSString * deviceName;到 DeviceDetailViewController

  • 覆盖--prepareForSegue:发送方:视图控制器执行segue的方法并传递设备名称,以这种方式作为发送方参数传递给segue的目标视图控制器:

  • 如果您在Storyboard设计中正确配置了目标视图控制器

  • ,那么destinationViewController @property将通过Storyboard新加载DeviceDetailViewController实例
  • setDeviceName:通过声明@property(...)deviceName可以神奇地获得方法;声明如果您使用的是最新版本的Xcode

<强> DeviceDetailViewController

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

<强>的TableView

- (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执行任何操作。