Ios 如何以编程方式转换到不同的视图控制器?

Ios 如何以编程方式转换到不同的视图控制器?,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,嘿,伙计们,我正试图让我的应用程序在调用某个方法时加载一个新视图。在方法中,我有以下代码: ViewController *GameOverViewController = [[ViewController alloc] init]; [self presentViewController:GameOverViewController animated:YES completion:nil]; 这是直接从 无论如何,当我试图从名为“游戏”的视图控制器切换到名为“游戏概览控制器”的视图控制器

嘿,伙计们,我正试图让我的应用程序在调用某个方法时加载一个新视图。在方法中,我有以下代码:

 ViewController *GameOverViewController = [[ViewController alloc] init];
 [self presentViewController:GameOverViewController animated:YES completion:nil];
这是直接从

无论如何,当我试图从名为“游戏”的视图控制器切换到名为“游戏概览控制器”的视图控制器时,我只会遇到大量错误。主要是

“未知接收器‘ViewController’;您是指‘UIViewController’

我的应用程序崩溃了。我显然做错了什么,但我不知道这到底是什么。我必须在我的游戏中声明GameOverViewController,还是在我的appDelegate中声明


编辑:两个视图控制器位于同一个主.Storyboard文件中,如果这很重要

未知接收器消息意味着它找不到名为
ViewController
的视图控制器类的类定义。这真的是“游戏结束”时使用的类的名称吗“视图控制器?如果是这样,您是否在
.m
文件的开头导入了
#ViewController.h

基本问题是它找不到名为
ViewController
的类


除此之外,我们通常不再使用
alloc
init
来实例化新的视图控制器,因为答案可能暗示了这一点。这是一种用于NIB的技术(只有在NIB名称与类名匹配时才起作用)

对于新开发人员,我可能会鼓励您从故事板开始。任何现代教程都应该指导您如何使用故事板。(谷歌“iOS故事板教程”,你可能会得到很多点击率。)

例如,如果您的故事板中有一个场景的“故事板标识符”为
GameOverViewController
,则您可以通过编程方式对其进行实例化,并使用如下内容呈现:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"GameOverViewController"];
[self presentViewController:controller animated:YES completion:nil];
UIViewController *controller = [[NSBundle mainBundle] loadNibNamed:@"nibname" owner:self options:nil]`;
[self presentViewController:controller animated:YES completion:nil];
或者,如果您的故事板上有一个从当前场景到下一场景的片段,您可以确保该片段有自己的故事板标识符,例如,
GameOverSegue
,然后您可以这样执行:

[self performSegueWithIdentifier:@"GameOverSegue" sender:self];
但是,在故事板上给自己找一个很好的介绍/教程,因为在堆栈溢出中寻找答案并不是一个很有成效的练习


出于历史目的,值得注意的是,如果您使用NIB,您可以使用问题中引用的构造(但您必须确保(a)类名正确;以及(b)您执行了
#import
该类标题)。如果目标NIB的名称与类不同,则必须执行以下操作:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"GameOverViewController"];
[self presentViewController:controller animated:YES completion:nil];
UIViewController *controller = [[NSBundle mainBundle] loadNibNamed:@"nibname" owner:self options:nil]`;
[self presentViewController:controller animated:YES completion:nil];

但这都是学术性的,除非你用的是笔尖。如果使用故事板,如果需要以编程方式过渡到新场景,请使用上述模式之一

你在你的头上。你应该放慢脚步,多做些学习,否则事情就会变得一团糟。我建议读一本关于iOS开发的好书并做练习

关于你的问题:

在您发布的代码中,您使用的是类“ViewController”。没有系统定义的类“ViewController”,尽管它在示例项目中是一个常见的类名,我认为Xcode中的一些项目模板甚至使用该类名创建根视图控制器

您为变量指定的名称(“上面代码中的GameOverViewController”)是本地的,并不十分重要。这只是一个变量名。如果愿意,可以将其重命名为lateForDinner,只要在定义它的范围内的任何地方更改该名称,就不会有任何区别

您被告知类“ViewController”是未知的,这表明它在程序中的任何地方都没有定义

您需要定义ViewController类的@interface和@implementation部分。通常,这些文件分别位于名为ViewController.h和ViewController.m的文件中。它们可能看起来像这样:

//ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController: UIViewController //Defines it as a subclass of UIViewController

// properties and methods of ViewController defined here

@end

也可以在单个头文件中包含多个类的接口,在单个.m文件中包含多个类的实现,尽管我非常不喜欢这种做法。保持简单-每个.h/.m文件对一个类,文件名与类名相同。

“通常不会以这种方式实例化视图控制器。”这一点很好。除了您建议的加载视图控制器的方法外,如果您使用的是XIB文件,您可以使用
initWithNibName:bundle:
从XIB.com加载视图控制器。事实上,如果NIB名称与类名匹配,您实际上可以使用
alloc
/
init
,它将为您完成NIB的工作。但是在NIB名称不同的情况下,
initWithNibName
是一种更健壮的方法。但如果他使用笔尖,我会感到惊讶,所以这可能是学术性的。哈哈,谢谢!这和你上面的评论相结合,为我解决了这个问题!这是出于学术目的,顺便说一句:)我正在使用情节提要,可以(a)给你的下一个场景一个唯一的情节提要id,你在
实例化控件的标识符中引用该id,或者(b)在两个场景之间有一个分段,给该分段一个唯一的情节提要id,然后调用
performsguewithidentifier
。见下面我的答案。即使您得到了正确的类名,
[[ViewController alloc]init]
技术也不适合您。什么是
ViewController