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

时间:2012-11-01 03:15:50

标签: objective-c interface-builder ios6 segue cs193p

我正在尝试遵循斯坦福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];
}
}

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

8 个答案:

答案 0 :(得分:19)

让我们看一下例外:

-[UIViewController setHappiness:]: unrecognized selector sent to instance

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

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

您编写了一个名为UIViewController的{​​{1}}子类,其中 具有HappinessViewController方法(或名为setHappiness:的读/写属性,生成方法)。并且您打算将接收器(目标视图控制器)作为该子类的实例(happiness)。

但是异常告诉你目标视图控制器只是普通的HappinessViewController。所以即使你认为你做了,你可能在故事板中设置了视图控制器的自定义类。也许您设置了一些其他视图控制器的自定义类,但是您没有设置此segue目标的类。

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

set custom class in identity inspector

答案 1 :(得分:7)

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

答案 2 :(得分:4)

我改变了故事板中视图控制器的类。enter image description here

答案 3 :(得分:1)

试试这样:

HappinessViewController *controller = segue.destinationViewController;
[controller setHappiness:7];

答案 4 :(得分:0)

我今天遇到了同样的问题,那是因为我的自定义类在库中。图书馆本身在构建阶段被链接,但这本身并不足以引入课堂。最后,我通过在AppDelegate中添加以下行来解决它。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   [ CustomClass class ];
}

这会强制链接器引入类。否则,简单地在库中链接可能不足以引入类,除非在应用程序的某处引用它。

答案 5 :(得分:0)

我尝试添加Cast并且它对我有用,我遇到了同样的问题:

 FirstViewController *detailViewController =
    (FirstViewController *)[segue destinationViewController];

答案 6 :(得分:0)

检查哪个prepareForSegue正在触发。我的问题是在当前的viewController和传入的viewController中触发了2个segues。解决方案,总是一个好的做法是检查segues标识符。

- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
     if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
    }
}

答案 7 :(得分:-1)

在分配之前进行投射

HappinessViewController *controller = (HappinessViewController *)segue.destinationViewController;
[controller setHappiness:7];

确保在故事板中,将HappinessViewController设置为VC的类