我有一个使用Storyboard的iOS 5选项卡式应用程序。
我的标签栏控制器指向三个导航控制器。
从其中一个,流程看起来像这样:
开始视图 - >照片视图(模态) - >目录视图
在照片屏幕上,我有一个包含以下代码的按钮:
- (IBAction)acceptPhotoButtonPressed:(id)sender {
UIViewController *catalogView = [self.storyboard instantiateViewControllerWithIdentifier:@"CatalogView"];
[self.navigationController pushViewController:catalogView animated:YES];
}
我尝试使用presentingViewController
,parentViewController
进行欺骗 - 甚至将类型转换为UINavigationController
。这会导致崩溃,并显示以下错误消息:
2012-04-06 00:32:45.808 myapp[19345:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarController pushViewController:animated:]: unrecognized selector sent to instance 0x18d0d0'
这告诉我,我没有抓住UINavigationController
,而是UITabBarController
。
有什么方法吗?
答案 0 :(得分:4)
“推送”样式segue只能从由UINavigationController
管理的视图控制器完成。如果你试图这样做,否则什么都不会发生。
您不应按照问题中的描述模态显示照片视图,而应显示UINavigationController的实例作为模态视图,并使Photo View成为导航视图的根视图控制器。 (这可以通过故事板设置)。然后你的推送segue将工作。
如果您不希望顶部导航栏出现在第一个视图控制器上(照片视图) 你可以使用:
[self.navigationController setNavigationBarHidden:YES animated:NO]
这将隐藏顶部导航栏。一旦你推动一个新的视图控制器,如果你想让导航栏重新出现在那个和任何后续的视图控制器上,你必须在新的视图控制器上将setNavigationBarHidden设置为NO。
[self.navigationController setNavigationBarHidden:NO animated:NO]
答案 1 :(得分:-1)
Segue是从一个场景转换到另一个场景的首选方式。
您可以从该按钮或VC本身创建一个Segue,并将该segue连接到您想要推送的场景。确保Segue属性设置为Push,然后在按钮的IBAction中(假设您连接到VC)执行此操作:
- (IBAction)acceptPhotoButtonPressed:(id)sender {
[self performSegueWithIdentifier@"mySegueID" sender:nil];
}
然后在prepareForSegue方法中:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString@"mySegueID"]) {
// Do whatever setup you need to do before firing the segue
}
}
如果你将Segue连接到按钮本身,那么你可以完全取消performSegue方法(你甚至不需要那个IBAction)。