topViewController 错误(iOS7 - 适用于 iOS8)
topViewController error (iOS7 - works on iOS8)
在对我的旧 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];
}
有人遇到过这种情况吗?
topViewController
是 UINavigationController
的 属性。
这是问题所在:
然后转至 ListaPlatosTableViewController
。您的代码应如下所示:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
ListaPlatosTableViewController *listaPlatosVC = (ListaPlatosTableViewController *)segue.destinationViewController;
listaPlatosVC.platosCarta = platosCarta;
listaPlatosVC.title = selectedCell;
}
我的解决方法:
以编程方式执行 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 启动的 "detail" 视图:
-(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 上的工作方式相同。
感谢所有花时间在此主题中回复的人! :)
在对我的旧 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];
}
有人遇到过这种情况吗?
topViewController
是 UINavigationController
的 属性。
这是问题所在:ListaPlatosTableViewController
。您的代码应如下所示:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
ListaPlatosTableViewController *listaPlatosVC = (ListaPlatosTableViewController *)segue.destinationViewController;
listaPlatosVC.platosCarta = platosCarta;
listaPlatosVC.title = selectedCell;
}
我的解决方法: 以编程方式执行 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 启动的 "detail" 视图:
-(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 上的工作方式相同。
感谢所有花时间在此主题中回复的人! :)