1

我有一个使用情节提要的 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'

所以这告诉我,我没有得到 a UINavigationController,而是 a UITabBarController

有没有办法解决?

4

2 回答 2

4

“推送”风格的 segue 只能从由UINavigationController. 如果你尝试这样做,否则什么都不会发生。

与其在问题中描述的那样以模态方式显示照片视图,不如将 UINavigationController 的实例显示为模态视图,并使照片视图成为导航视图的根视图控制器。(这都可以通过故事板设置)。然后你的 push segue 就可以工作了。

如果您不希望顶部导航栏出现在您的第一个视图控制器(照片视图)上,您可以使用:

[self.navigationController setNavigationBarHidden:YES animated:NO]

这将隐藏顶部导航栏。一旦你推送了一个新的视图控制器,如果你想让导航栏重新出现在那个和任何后续的视图控制器上,你必须在新的视图控制器上将 setNavigationBarHidden 设置为 NO。

[self.navigationController setNavigationBarHidden:NO animated:NO]
于 2012-04-06T19:10:23.100 回答
-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)。

于 2012-04-05T22:42:38.063 回答