2012-05-30 37 views
14

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

请帮助我,感谢

编辑: 我无意中子类的UINavigationController,而不是UIViewController的在我的课。 反正谢谢你。

+0

请检查以下https://github.com/cruffenach/Mobile-Tuts-Plus-UIStoryboard –

+0

总之,好吗? –

+0

所以你把'RootiViewController'改成了'UIViewController'? – woz

回答

10

我已经试过这一点,并没有任何问题,一切都在IB,而无需额外的代码做了...

  1. 启动一个新项目,“单一视图的应用”用故事板
  2. 选择故事板并删除其制作的视图。
  3. 将上一个新的导航控制器(它会带给人们一个表视图)
  4. 删除表和表视图控制器,所以你只是留下了导航控制器
  5. 将一个普通视图控制器
  6. 右键单击并从导航控制器拖动到新的视图并选择“关系 - 根视图控制器”
  7. 将“Bar Button Item”拖到Navbar上,该视图应该在ViewController的顶部显示,您可以如果你愿意,可以重新命名这个前进
  8. 现在拖动另一个视图控制器,这是您的“转发”按钮将推入以查看。
  9. 右键单击并拖动从栏按钮到第二视图控制器,并选择“推”

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

PushViewControllers

等离子

+0

谢谢!另一个(小)que - 我可以这样做“推”编程?我的意思是,我想要做一个if语句 - 例如,只有当应用程序已被授权到游戏中心时。我怎样才能做到这一点? –

+0

顺便说一句,你的方式抛出我这个错误: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) –

+0

我只能认为你也许没有有问题?您是否为最后2个视图选择了简单的“视图控制器”,而不是导航控制器。直到yhr点o右键单击并拖动视图应该是纯白色的正方形,除了状态栏外,其他都没有。连接箱子后,蓝色导航栏会自动放置。 – Plasma

0

以编程方式交换意见,你就需要选择SEGUE,并给它像 “PushView” 然后调用它像这样的标识符....

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

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

PushView.zip

1

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

使用其他方法,我发现UINavigationController会从原始故事板保留 - 我不想 - 或者我会得到错误。

在您的视图控制器使用的AppDelegate设置RootViewController的工作对我来说(借款赛格瑞从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; 
+0

我可以帮你解决这个问题。考虑http://stackoverflow.com/a/23403979/294884和http://stackoverflow.com/a/23060746/294884(它总是很难知道“什么是问题/解决方案”与摩擦'storyboard-viewcontrollers-容器!如果这与你的需求无关,不会造成伤害。) – Fattie

0

我也想做到这一点,呈现出画面(即有一个嵌入式导航控制器)当用户按下按钮时。

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

这是我找到了解决办法:

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

然后创建按CTRL单击在第一个视图控制器按钮,拖动到视图控制器你想展示(不被指向它的导航控制器)在一个新的SEGUE,然后选择推送小弹出窗口。

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

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

如果你想自定义显示为后退按钮返回字符串,您可以添加在viewDidLoad方法正在被显示后,按下按钮视图控制器的这条线,那就是儿童视图控制器。
(替代“设置”您所需要的名字)

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

} 
相关问题