【发布时间】:2012-08-05 15:40:51
【问题描述】:
我的根控制器是一个带有静态单元格和导航控制器的 TableViewController。 根据选择的单元格,我想推送另一个 ViewController(带有嵌入式 TableView),它将相应地更改其配置(是否启用按钮,来自 db 表或 NSArray 的单元格数据等)。 选择一些“Controller A”单元格将调用“Controller B”或“Controller C”并传递一些数据。
我正在尝试的代码如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
switch (indexPath.row) {
case 0:
{
[self performSegueWithIdentifier:@"segueToType" sender:self];
}
break;
case 1:
{
[self performSegueWithIdentifier:@"segueToType" sender:self];
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"segueToType"])
{
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
NSInteger rowNumber = selectedIndexPath.row;
switch (rowNumber) {
case 0:
{
TypeSelectController *selCon = [segue destinationViewController];
selCon.myPet = self.myPet;
selCon.sel = @"tipo";
selCon.delegate = self;
}
break;
case 1:
{
TypeSelectController *selCon = [segue destinationViewController];
selCon.myPet = self.myPet;
selCon.sel = @"razza";
selCon.delegate = self;
}
break;
default:
break;
}
}
}
在这种情况下,例如,我只调用“控制器 B”,但根据“控制器 A”的选定单元格,它以不同的方式配置自身(取决于“selCon.sel”字符串)。
在“控制器B”中,我有这样的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([sel isEqualToString:@"tipo"]) {
NSString *itemToPassBack = [tipi objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@"tipo"];
[self.navigationController popViewControllerAnimated:YES];
} else if ([sel isEqualToString:@"razza"]) {
NSString *itemToPassBack = [razze objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@"razza"];
[self.navigationController popViewControllerAnimated:YES];
}
}
同样,根据字符串“sel”的值,我将不同的数据返回到“控制器 A”。
当我选择控制器 A 中的第一个单元格时,我正确地获得了控制器 B 场景。然后我选择一个单元格并返回正确数据的控制器 A。 现在,如果我尝试选择控制器 A 中的第二个单元格并选择控制器 B 中的一个单元格,导航不会按我的意愿响应,我会得到控制器 C 场景,然后是控制器 A 和以下错误:
嵌套推送动画会导致导航栏损坏
在意外状态下完成导航转换。导航栏子视图树可能已损坏。
开始/结束外观转换的不平衡调用。
我做错了什么?
【问题讨论】:
-
我不确定这里是否有足够的代码来帮助你。你看起来没问题,除了你在用这条线做什么: [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@"razza"];我不明白在 addItemViewController 委托调用中将 self 传回。您是否将其注入到您的视图控制器或导航流中?
-
这是使用委托方法将数据传回控制器 A 所需的部分代码。我使用了此链接中显示的代码:stackoverflow.com/questions/5210535/…
-
该示例在理论上很好,但在您使用故事板和转场时不合适。您需要如何处理“要传回的项目”? - 特别是在使用协议和委托时,您通常设置一个属性或将一个属性传递给一个方法回原始 vc。我给你写一个答案。
-
@Aleph72 在回答您上面的评论时,子控制器 B 不一定需要将自己传递回父控制器 A。我可以想象一些您可能需要的情况,但我一般不会。
-
@Aleph72 几个问题: 1. 我假设您正在使用 push segues。 2.控制器B和控制器C都是
TypeSelectController的实例吗? 3.你能告诉我们你的A控制器的addItemViewController代码吗? 4. 我假设您的 B 和 C 控制器本身没有嵌入到导航控制器中。
标签: ios uinavigationcontroller segue