iOS 5尝试从模态视图中推送ViewController

时间:2012-04-05 22:35:20

标签: ios5

我有一个使用Storyboard的iOS 5选项卡式应用程序。

我的标签栏控制器指向三个导航控制器。

从其中一个,流程看起来像这样:

开始视图 - >照片视图(模态) - >目录视图

在照片屏幕上,我有一个包含以下代码的按钮:

- (IBAction)acceptPhotoButtonPressed:(id)sender {
    UIViewController *catalogView = [self.storyboard instantiateViewControllerWithIdentifier:@"CatalogView"];
    [self.navigationController pushViewController:catalogView animated:YES];
}

我尝试使用presentingViewControllerparentViewController进行欺骗 - 甚至将类型转换为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

有什么方法吗?

2 个答案:

答案 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)。