0

我试图将数据从 TableViewCell 传递到另一个 ViewController。但是在另一个 ViewController 中没有显示数据。这是我的代码

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

4 回答 4

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

如果您创建从表格单元格到视图控制器的转场,则无需执行以下操作,因为此方法是以编程方式执行转场。

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

于 2012-10-24T04:19:22.470 回答
1

好的。假设您有两个视图控制器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.

//另外如果需要push viewcontroller add pushviewcontroller:SecondViewController,或者用IB将tableview cell和SecondViewController用push方法连接起来。}

在这种情况下,您不需要使用 perform segue。Setter 方法将在您设置secDetailItem某些内容后立即起作用。

此外,如果您需要更新您的视图,请SecondViewController添加此方法。

- (void)configureView

{

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

}

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

于 2012-10-24T09:03:51.367 回答
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

于 2012-10-24T09:04:05.510 回答
-1

它可能与这一行有关:

[UIView commitAnimations];

如果你不需要它,你可以删除它。

于 2012-10-24T04:18:47.253 回答