UIViewController在prepareForSegue上抛出无法识别的选择器异常

use*_*252 7 objective-c interface-builder cs193p segue ios6

我正在尝试跟随斯坦福CS193p iOS编程讲座.其中一个名为"Happiness"的演示程序创建了两个UIViewControllers,一个"PsychViewController"和一个"HappinessViewController".它使用目标操作方法从PsychViewController切换到HappinessViewController.

以下代码不断抛出此异常:" - [UIViewController setHappiness:]:无法识别的选择器发送到实例"

这是有问题的代码:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ShowDiagnosis"]) {
    [segue.destinationViewController setHappiness:7];
}
}
Run Code Online (Sandbox Code Playgroud)

我搜索过这个网站和其他人,并且通常在出现此错误时,这是​​因为通用的UIViewController尚未正确设置为程序中使用的特定视图控制器对象,在本例中为"HappinessViewController".但我已经使用IB中的身份检查器将通用UIViewController设置为HappinessViewController,我仍然得到异常.我正在撕扯我的头发,如果有人可以提供帮助,我将非常感激.

rob*_*off 19

我们来看看异常:

-[UIViewController setHappiness:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)

这告诉您有关无法识别的消息的两件事.它会告诉你选择器setHappiness:.它还告诉你接收器的实际运行时类,UIViewController.

当然,UIViewController没有方法命名setHappiness:.这就是你得到例外的原因.

你写的子类,UIViewController称为HappinessViewController确实有一个setHappiness:方法(或称为读/写性能happiness,其产生的方法).并且您打算将接收器(目标视图控制器)作为该子类(HappinessViewController)的实例.

但是例外是告诉你目标视图控制器只是一个简单的UIViewController.所以,即使你认为你这样做,你可能并没有设置视图控制器的自定义类的故事板.也许你设置其他一些的自定义类视图控制器,但你没有设置这个segue目的地的类.

您需要在Identity Inspector中设置目标视图控制器的自定义类,如下所示:

在身份检查器中设置自定义类


use*_*252 7

我解决了这个问题.虽然我已正确指定相关的UIViewController是HappinessViewController,但是链接器由于某种原因而没有链接到正确的文件.解决方法是双击Xcode中的.xcodeproj文件,然后转到Build Phases并手动添加"Compile Sources"下的文件.