将TableViewCell推送到另一个ViewController时出错

时间:2012-10-24 04:13:40

标签: objective-c ios uitableview ios5.1

我试图将数据从TableViewCell传递到另一个ViewController.But没有数据显示在另一个ViewController.here是我的代码

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


   PeripheralManager *objSelected=[device objectAtIndex:indexPath.row];

   [self prepareForSegue:@"TableDetails" sender:objSelectedDevice];
 }


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{


   if ([segue.identifier isEqualToString:@"TableDetails"])
   {


   DetailViewController *detail=segue.destinationViewController;
   detail.dataArray=device;
   }

 }

错误消息

nested push animation can result in corrupted navigation bar
2012-10-24 12:01:39.805 [3182:707] nested push animation can result in corrupted navigation bar
2012-10-24 12:01:40.164 [3182:707] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2012-10-24 12:01:40.167 [3182:707] Finishing up a get navigation transition in an unexpected state. Navigation Bar subview tree might corrupted.

4 个答案:

答案 0 :(得分:4)

你不需要这个:

[self.navigationController pushViewController:mdc animated:YES];

这是Segue自动执行的操作

此外,您有3行将加载视图控制器 - 请参阅下面的注释:

NSInteger row=[indexPath row];
NSString *value=[device objectAtIndex:row];
MeBleDetailViewController *mdc=[self.storyboard instantiateViewControllerWithIdentifier:@"MeBleDetailViewController"];  
mdc.deviceName=value;
[self presentModalViewController:mdc animated:YES];    // Load ViewController
[UIView commitAnimations];
[self performSegueWithIdentifier:@"TableDetails" sender:[device objectAtIndex:indexPath.row]];    // Load ViewController
[self.navigationController pushViewController:mdc animated:YES];   // Load ViewController

这就是您收到该错误的原因:嵌套推送动画可能导致导航栏损坏

此外,如果您已将segue从表格单元格配置到另一个视图控制器,那么您在didSelectRowAtIndexPath方法中不需要任何内容​​。


编辑:

无论您希望推送的视图控制器拥有什么数据 - 将其放在prepareforSegue方法中而不是didSelectRowAtIndexPath

如果从表格单元格创建一个segue来查看控制器,那么您不需要执行以下操作,因为此方法是以编程方式执行segue。

[self performSegueWithIdentifier:@"TableDetails" sender:[device objectAtIndex:indexPath.row]];

答案 1 :(得分:1)

行。假设您有两个viewcontrollers FirstViewControllerSecondViewController。 在FirstViewController中,您有一个tableview,当然还有tableviewcell。在SecondViewController中,您需要显示数据。 因此,在SecondViewController.h中,您需要设置某个变量的属性,在这种情况下,它属于id类型@property (strong, nonatomic) id secDetailItem;。在SecondViewController.m中合成它并添加像这样的setter方法

-(void)setDetdetailItem:(id)newSecdetailItem{
if (secDetailItem != newSecdetailItem) {
    secDetailItem = newSecdetailItem;

    // Update the view.
     [self configureView];//This method is needed to update view if there are some changes in that view.
}
}

然后在FirstViewController.h导入SecondViewController.h然后添加属性@property (strong, nonatomic) SecondViewController *secondViewController; 合成。在此委托方法的FirstViewController.m文件中执行以下操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
 self.secondViewController.secDetailItem=//set your data should be passed.

//如果你需要推送viewcontroller add pushviewcontroller:SecondViewController,或者使用IB连接tableview单元和SecondViewController以及push方法。 }

在这种情况下,您不需要使用perform segue。只要设置为secDetailItem,就可以使用Setter方法。

此外,如果您需要在SecondViewController中更新您的观点,请将此方法添加到其中。

- (void)configureView

{

if (self.secDetailItem) {
    self.textLabel.text=self.secDetailItem;//Data passed from FirstViewController
}

}

这就是你需要做的。对不起,如果它很复杂。问任何问题。

答案 2 :(得分:1)

删除你的额外代码只做这个 -

DetailViewController.h

@property(nonatomic, retain)NSMutableArray *dataArray;

DetailViewController.m

@synthesize dataArray = _dataArray;

现在在TableViewController.m中写下这个 -

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if([segue.identifier isEqualToString:@"TableDetails"])
   {
     DetailViewController *detailViewObject = segue.destinationViewController;
     detailViewObject.dataArray = anyArray;
   }
}

我在这里传递NSMutableArray

答案 3 :(得分:-1)

这可能与此行有关:

[UIView commitAnimations];

如果您不需要,可以将其删除。