7

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

以下代码不断抛出此异常:“-[UIViewController setHappiness:]: unrecognized selector sent to instance”

这是有问题的代码:

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

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

4

8 回答 8

19

让我们看一下异常:

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

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

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

您编写了一个UIViewController被调用的子类,HappinessViewController确实有一个setHappiness:方法(或一个名为 的读/写属性happiness,它生成该方法)。并且您打算让接收者(目标视图控制器)成为该子类 ( HappinessViewController) 的一个实例。

但例外是告诉您目标视图控制器只是一个普通的UIViewController. 因此,即使您认为您做到了,您也可能没有情节提要中设置视图控制器的自定义类。也许你设置了其他视图控制器的自定义类,但你没有设置这个 segue 目的地的类。

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

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

于 2012-11-01T03:32:54.420 回答
7

我解决了这个问题。尽管我已正确指定相关的 UIViewController 是幸福视图控制器,但链接器由于某种原因没有链接到正确的文件。修复方法是双击 Xcode 中的 .xcodeproj 文件,然后转到 Build Phases 并在“Compile Sources”下手动添加文件。

于 2012-11-01T20:20:05.860 回答
4

对我来说,改变故事板中视图控制器的类是有效的。在此处输入图像描述

于 2014-07-16T08:06:10.943 回答
1

试试这样:

HappinessViewController *controller = segue.destinationViewController;
[controller setHappiness:7];
于 2012-11-01T03:19:27.867 回答
0

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

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

这迫使链接器拉入类。否则,仅在库中链接可能不足以引入类,除非它在应用程序中的某处被引用。

于 2014-12-09T06:23:19.623 回答
0

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

 FirstViewController *detailViewController =
    (FirstViewController *)[segue destinationViewController];
于 2015-04-12T19:00:34.357 回答
0

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

- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
     if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
    }
}
于 2017-09-21T00:57:51.363 回答
-1

分配前投射

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

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

于 2013-05-13T19:36:42.527 回答