我试图将数据从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.
答案 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 FirstViewController
和SecondViewController
。
在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];
如果您不需要,可以将其删除。