【问题标题】:topViewController error (iOS7 - works on iOS8)topViewController 错误(iOS7 - 适用于 iOS8)
【发布时间】:2015-01-25 17:58:29
【问题描述】:

在我的旧 iPhone 4 (iOS 7.1.2) 上进行一些测试时,我在执行从初始 collectionView 到 tableView 的 segue 时遇到错误。

在 iOS 8 上一切正常,但在 iOS 7 上出现以下错误:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[ListaPlatosTableViewController topViewController]:无法识别的选择器发送到实例 0x17df3c70”

我的 prepareForSegue 方法如下:

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

UINavigationController *nav = [segue destinationViewController];
ListaPlatosTableViewController *listaPlatosVC = (ListaPlatosTableViewController *)nav.topViewController;
[listaPlatosVC setPlatosCarta:platosCarta];

//I have set selectedCell in the method where I call performSegueWithIdentifier
[[[segue destinationViewController]topViewController]setTitle:selectedCell];

}

//更新: 这是调用 segue 的代码,以防我忽略了什么

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
selectedCell = [tiposCarta objectAtIndex:indexPath.row];
[self ponerPlatosEnCarta]; // I prepare platosCarta with this method
[self performSegueWithIdentifier:@"ListaPlatos" sender:self];
}

有人遇到过吗?

【问题讨论】:

  • iOS7 和 8 都使用相同的情节提要,这是针对完全相同的测试(所以相同的 segue)?
  • 你能检查一下 nav 是否是 ListaPlatosTableViewController 的类型。我认为它是 UINavigationController,或者 ListaPlatosTableViewController 没有名为 topViewController 的属性。
  • @Wain - 我在两台设备上测试完全相同的代码,选择相同的集合视图单元格,它在一个上工作,而在另一个上失败......
  • topViewController 是导航控制器的属性,而不是表格视图控制器,因此 segue 应该指向导航控制器以使您的代码正常工作。如果使用相同的故事板,那么代码应该在两种情况下都可以工作或失败,您需要在这两种情况下进行调试以查看发生了什么。
  • topViewController 只是 UINavigationController 的任何子类的属性。所以你不能将它与 UITableViewController 一起使用

标签: objective-c ios7 ios8


【解决方案1】:

topViewControllerUINavigationController 的属性。

问题来了: 然后转至ListaPlatosTableViewController。您的代码应如下所示:

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

    ListaPlatosTableViewController *listaPlatosVC = (ListaPlatosTableViewController *)segue.destinationViewController;

    listaPlatosVC.platosCarta = platosCarta;
    listaPlatosVC.title = selectedCell;
}

【讨论】:

  • 这确实简化了我的代码,但我在 iOS7 上仍然遇到同样的错误......无论是在模拟器中还是在我的设备上......无论如何感谢您的提示! :)
  • 您的ListaPlatosTableViewController 是否嵌入在导航控制器中,并且segue 指向该导航控制器?还是直接指向ListaPlatosTableViewController?您能否上传您的界面构建器的屏幕截图?
  • 您必须删除第二个导航控制器。您已经有一个导航控制器,因此您的两个视图控制器都嵌入在初始导航控制器中。所以,去掉中间的navigationController,直接把segue指向ListaPlatosTableViewController
  • 当调用 [self.navigationController setNavigationBarHidden:NO animated:YES];如果我删除了第二个导航控制器,什么也不会发生......好像表格视图没有嵌入到初始导航控制器中......我明天将继续工作,因为我可能只是错过了一个简单的细节......谢谢再次为您提供提示,我会在您的帮助下尽快将您的答案标记为正确
【解决方案2】:

我的解决方案: 以编程方式执行 segues,而不是使用情节提要中的 control-click。 我不知道我是否对故事板做错了,或者它是否是 Xcode-ios7 的错误(因为它适用于 iOS8) 无论如何,我所做的是:

断开在 Storyboard 中出现问题的视图,并通过以下方法准备并启动它们:

我的自定义 tableview 从 collectionView 启动:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
selectedCell = [tiposCarta objectAtIndex:indexPath.row];
[self ponerPlatosEnCarta];
ListaPlatosTableViewController *listaPlatosVC = [self.storyboard instantiateViewControllerWithIdentifier:@"listaPlatosVC"];
[self.navigationController pushViewController:listaPlatosVC animated:YES];
[listaPlatosVC setPlatosCarta:platosCarta];
[listaPlatosVC setTitle:selectedCell];
}

从 tableView 启动的“详细”视图:

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

 PlatoHormigueroViewController *dvc = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
 dvc.elPlato = [self.platosCarta objectAtIndex:indexPath.row];
 [tableView deselectRowAtIndexPath:indexPath animated:NO];
 [self.navigationController pushViewController:dvc animated:YES];

}

这样它在 iOS 7 上的工作方式与 8 相同。

感谢所有在此线程中回复的人抽出宝贵时间! :)

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多