【问题标题】:Pushing a navigation controller is not supported- performing segues不支持推送导航控制器 - 执行 segues
【发布时间】:2012-06-04 17:57:43
【问题描述】:

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

请帮帮我,谢谢

编辑: 我不小心将 UINavigationController 子类化了,而不是我的类中的 UIViewController。 不管怎样,谢谢你。

【问题讨论】:

标签: objective-c ios


【解决方案1】:

我已经尝试过了,没有任何问题,它全部在 IB 中完成,不需要额外的代码......

  1. 使用故事板开始一个新项目“单一视图应用程序”
  2. 选择故事板并删除其生成的视图。
  3. 拖动一个新的导航控制器(它会带来一个表格视图)
  4. 删除表格和表格视图控制器,只剩下导航控制器
  5. 在普通视图控制器上拖动
  6. 右键单击并从导航控制器拖动到新视图,然后选择“关系 - 根视图控制器”
  7. 将“Bar Button Item”拖到导航栏上,该导航栏应该在 ViewController 的顶部可见,您可以根据需要重命名此 Forward。
  8. 现在拖动另一个视图控制器,这是您的“前进”按钮将推入查看的控制器。
  9. 右键单击并从栏按钮拖动到 2nd View Controller,然后选择“Push”

运行项目,您将获得一个带有导航栏和您的按钮的单一视图,单击您的按钮将推送另一个视图并给您一个返回按钮以返回到第一个视图控制器。如果有帮助,我会尝试发布我的故事板的图片。

等离子

【讨论】:

  • 谢谢!另一个(小)问题-我可以以编程方式“推动”吗?我的意思是,我想做一个 if 语句——例如,只有当应用程序已被授权到游戏中心时。我该怎么做?
  • 顺便说一句-你的方式向我抛出了这个错误:TwentyOneQuestions[37746:1bb03] ***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持推送导航控制器”***第一掷调用堆栈:(0x132f022 0x26e6cd6 0x38cf1b 0xb36452d 0x38ca24 0x6e8de6 0x6dd4d0 0x1330e99 0x2b514e 0x4f3a0e 0x1330e99 0x2b514e 0x2b50e6 0x35bade 0x35bfa7 0x35b266 0x2da3c0 0x2da5e6 0x2c0dc4 0x2b4634 0x18e9ef5 0x1303195 0x1267ff2 0x12668da 0x1265d84 0x1265c9b 0x18e87d8 0x18e888a 0x2b2626 0x296d 0x28d5)终止称为抛出异常(LLDB)跨度>
  • 我只能认为你可能做错了什么?您是否为最后 2 个视图选择了普通的“视图控制器”,而不是导航控制器。直到 yhr 点 o 右键单击​​并拖动视图应该是纯白色方块,除了状态栏之外没有任何内容。连接盒子后,会自动放置蓝色导航栏。
  • 有趣,你下载了我在下面帖子中的示例项目并尝试了吗?
  • 如果我进行模态转换,它可以工作,但会显示一个黑色视图控制器,其中没有任何内容 - 但它应该显示为白色背景和几个按钮。
【解决方案2】:

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

使用其他方法,我发现 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;

【讨论】:

【解决方案3】:

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

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

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

PushView.zip

【讨论】:

    【解决方案4】:

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

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

    这是我找到的解决方案:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 2013-03-09
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多