推送导航控制器不受支持-执行Segues。

15
我在故事板中创建了一个新的导航控制器(非编程方式),并将其设置为“根视图控制器”到一个普通的UIViewController,然后添加了一个按钮,上面写着“前往下一个视图控制器”(这个第二个视图控制器是我希望它有一个返回按钮来链接到初始视图控制器)。 现在,每当我尝试将按钮链接到下一个视图控制器时,“Pushing a navigation controller is not supported”(推动导航控制器不受支持)。
请帮帮我,谢谢。
编辑: 我无意中子类化了UINavigationController,而不是UIViewController。 无论如何,还是谢谢你。

请查看以下链接:https://github.com/cruffenach/Mobile-Tuts-Plus-UIStoryboard - Omar Abdelhafith
那么你把 RootiViewController 改成了 UIViewController - woz
4个回答

10

我已经尝试过这个方法,并且没有任何问题,所有的操作都在IB中完成,不需要额外的代码。

  1. 开始一个新的项目,使用storyboards创建“Single View Application”(单视图应用)
  2. 选择Storyboard并删除它产生的视图。
  3. 拖动一个新的导航控制器(它会带来一个表视图)
  4. 删除表格和表视图控制器,所以你只剩下导航控制器了。
  5. 拖动一个普通的视图控制器
  6. 右键单击并从导航控制器向新视图拖动,并选择“关系 - 根视图控制器”
  7. 在Navbar上拖动一个“Bar Button Item”(导航栏按钮),如果您愿意,可以将其重命名为“Forward”(前进)。
  8. 现在拖入另一个视图控制器,这是您的“Forward”按钮将要推出的视图。
  9. 右键从工具栏按钮向第二个视图控制器拖动,并选择“Push”(推送)

运行项目,你将得到一个带有导航栏和按钮的单个视图,在点击按钮后会推出另一个视图,并提供返回到第一个视图控制器的后退按钮。如果有帮助,我会尝试发布我的Storyboard的图片。

PushViewControllers

Plasma


谢谢!还有一个(微小的)问题-我能以编程方式执行这个“推送”吗?我的意思是,我想要进行一个if语句-例如,只有在应用程序已被授权使用游戏中心时才执行。我该怎么做呢? - Lior Pollak
有趣,你下载了我在下面帖子中的示例项目并尝试了吗? - Plasma
如果我进行模态转换,它可以工作,但会显示一个黑色的视图控制器,里面什么都没有 - 但它应该显示白色背景和几个按钮。 - Lior Pollak
在我的下面的示例项目中,我将转换到模态的过渡进行了交换,一切仍然有效,只是没有办法返回,如果你想要以模态方式显示它,你需要使用... [self dismissModalViewControllerAnimated:YES]; 或者放置另一个segue来返回到原始视图控制器。 - Plasma
搞定了 - 删除了故事板,创建了一个新的,现在完美运行。无论如何还是谢谢! - Lior Pollak
显示剩余2条评论

1
我遇到了同样的问题。我想在每个故事板上都有一个导航控制器,这样每个故事板可以独立运行、单独调试,并且导航栏的外观也会正确显示。
尝试使用其他方法时,我发现导航控制器会从原始故事板中保留下来,而我不希望出现这种情况,或者我会遇到错误。
在您的视图控制器中使用AppDelegate来设置rootViewController对我很有效(借用segue命名约定来自Segue to another storyboard?)。
- (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;

我可能可以帮你解决这个问题。请参考以下链接:https://dev59.com/KGAg5IYBdhLWcg3wm7_6#23403979 和 http://stackoverflow.com/a/23060746/294884 (在处理 storyboard-viewcontrollers-containers 时,很难知道“问题/解决方案”是什么!如果这与您的需求无关,则没有任何损失。) - Fattie

0

我也想要这样做,当用户按下按钮时呈现一个屏幕(其中嵌入了导航控制器)。

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

这是我找到的解决方案:

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

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

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

IB会给您一个警告“场景由于缺少入口点而无法访问,并且没有标识符可通过-instantiateViewControllerWithIdentifier:进行运行时访问。” 不用担心,它可以完美地工作。

如果您想自定义显示为“返回”按钮的字符串,可以在viewDidLoad方法中添加此行代码在按钮按下后显示的视图控制器(即子视图控制器)中。
(将“设置”替换为所需名称)
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationController.navigationBar.topItem.title = @"Settings";
    ...

}

0
要通过编程方式交换视图,您需要选择转场并为其命名一个标识符(例如“PushView”),然后像这样调用它...
[self performSegueWithIdentifier:@"PushView" sender:self];

这将以编程方式执行与单击前进按钮相同的操作。我已经为您创建了一个示例项目,其中包含上述代码。其中有一个-(IBAction),其中包含可用于以编程方式更改视图的代码。

PushView.zip


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接