您问题中的上述代码很好。我知道您问的是如何在没有按钮的情况下执行此操作,但您演示的问题是您使用了一个按钮,但没有将其正确连接到IBAction
. 您goNext
应该在 .h 中定义为:
- (IBAction)goNext:(id)sender;
实施应该是:
- (IBAction)goNext:(id)sender
{
UIViewController *vc=[[self storyboard] instantiateViewControllerWithIdentifier:@"10"];
[self.navigationController pushViewController:vc animated:YES];
}
我想你是IBAction
手动创建的。未来值得注意的是,如果你control从按钮向下拖动(或右键拖动)到助手编辑器文件,你可以自动创建你的IBAction
界面,并且不会发生这种错误:

顺便说一句,我个人更喜欢使用 segue,所以我首先定义视图控制器本身之间的 push segue。在 Xcode 6 中,可以control从场景上方的视图控制器图标 - 拖动到目标场景:

在 6 之前的 Xcode 版本中,可以control从场景下方栏中的视图控制器图标 - 拖动:

然后我在 Interface Builder 中选择 segue 并给它一个“故事板标识符”(在这个例子中,我称之为它pushTo10
):

然后我让我goNext
执行那个segue,而不是手动调用pushViewController
:
- (IBAction)goNext:(id)sender
{
[self performSegueWithIdentifier:@"pushTo10" sender:self];
}
这样做的好处是我的故事板现在直观地代表了我的应用程序的流程(而不是看起来有一个场景漂浮在那里),并且像导航栏这样的图形元素在故事板中正确表示。
您不必这样做,但这是另一种需要注意的选择。