不支持推送导航控制器 - 执行segues

时间:2012-05-30 13:28:25

标签: objective-c ios

我在故事板中创建了一个新的导航控制器(不是以编程方式!)并将其设置为常规UIViewController的“Root View Controller”,并在其中添加了一个按钮,该按钮表示 - 转发到下一个视图控制器(第二个视图) controller是一个视图控制器,我希望它有一个后退按钮链接到初始视图控制器)。 现在,每当我尝试将按钮链接到下一个视图控制器时 - “不支持推送导航控制器”。

请帮帮我,谢谢

编辑: 我意外地将UINavigationController子类化,而不是我班级中的UIViewController。 还是非常感谢。

4 个答案:

答案 0 :(得分:10)

我已经尝试了这个并且没有任何问题,它全部在IB中完成,无需额外的代码...

  1. 使用故事板开始一个新项目“单一视图应用程序”
  2. 选择故事板并删除其生成的视图。
  3. 在新的导航控制器上拖动(它将带来一个表格视图)
  4. 删除表格和表格视图控制器,这样您就可以使用导航控制器
  5. 在普通视图控制器上拖动
  6. 右键单击并从导航控制器拖动到新视图,然后选择“关系 - 根视图控制器”
  7. 将“条形按钮项目”拖动到应该在ViewController顶部显示的导航栏上,如果愿意,可以将其重命名为。
  8. 现在拖动另一个视图控制器,这是您的“前进”按钮将推入的视图。
  9. 右键单击并从小节按钮拖动到第二个视图控制器,然后选择“推送”
  10. 运行项目,您将获得一个带有Navbar和按钮的单一视图,单击您的按钮将推送另一个视图并为您提供一个返回按钮以返回到第一个View Controller。如果有帮助的话,我会尝试发布我的故事板的图片。

    PushViewControllers

    血浆

答案 1 :(得分:1)

我遇到了同样的麻烦。我想在每个故事板上都有一个导航控制器,这样每个都可以独立运行,单独调试,以便导航栏的外观正确。

使用其他方法,我发现UINavigationController将保留在原始故事板中 - 这是我不想要的 - 或者我会收到错误。

在视图控制器中使用AppDelegate设置rootViewController为我工作(从Segue to another storyboard?借用segue命名约定):

- (void)showStartupNavigationController {
NSLog(@"-- Loading storyboard --");

//Get the storyboard from the main bundle.
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Startup" bundle:nil];
//The navigation controller, not the view controller, is marked as the initial scene.
UINavigationController *theInitialViewController = [storyBoard instantiateInitialViewController];

NSLog(@"-- Loading storyboard -- Nav controller: %@", theInitialViewController);

//Remove the current navigation controller.
[self.navigationController.view removeFromSuperview];
UIWindow *window = [(AppDelegate *)[[UIApplication sharedApplication] delegate] window];
window.rootViewController = theInitialViewController;

答案 2 :(得分:0)

以交换方式交换视图你需要选择segue并给它一个像“PushView”这样的标识符,然后像这样调用它....

[self performSegueWithIdentifier:@"PushView" sender:self];

这将以编程方式执行与单击前进按钮相同的操作。我用上面讨论的代码创建了一个示例项目。有一个 - (IBAction)代码,你可以用来以编程方式改变视图。

PushView.zip

答案 3 :(得分:0)

我也想这样做,当用户按下按钮时会出现一个屏幕(有一个嵌入式导航控制器)。

在我第一次尝试时,我将第一个屏幕中按钮的segue连接到导航控制器,应用程序崩溃时出现此错误“不支持推送导航控制器”。

这是我找到的解决方案:

从第一个屏幕中的按钮到导航控制器选择segue。 如果它有标识符,请复制其名称。然后删除那个segue。

然后通过CTRL单击第一个视图控制器中的按钮并拖动到您想要呈现的视图控制器(而不是指向它的导航控制器)创建一个新的segue,并且在弹出的小窗口中选择Push。

然后单击segue中间的图标并粘贴您在第一步中复制的名称作为其标识符。

IB将向您发出警告“由于缺少入口点而无法访问场景,并且没有通过-instantiateViewControllerWithIdentifier进行运行时访问的标识符:”。别担心,它完美无缺。

如果要自定义显示为返回按钮的字符串,可以在viewDidLoad方法中添加此行按下按钮后显示的视图控制器,那是儿童视图控制器 (将“设置”替换为您需要的名称)

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.topItem.title = @"Settings";
    ...

}
相关问题