我正在尝试遵循斯坦福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,我仍然得到异常。我正在撕扯我的头发,如果有人可以提供帮助,我将非常感激。
答案 0 :(得分:19)
让我们看一下例外:
-[UIViewController setHappiness:]: unrecognized selector sent to instance
这告诉您有关无法识别的消息的两件事。它会告诉您选择器setHappiness:
。它还告诉您接收器的实际运行时类UIViewController
。
当然,UIViewController
没有名为setHappiness:
的方法。这就是你得到例外的原因。
您编写了一个名为UIViewController
的{{1}}子类,其中 具有HappinessViewController
方法(或名为setHappiness:
的读/写属性,生成方法)。并且您打算将接收器(目标视图控制器)作为该子类的实例(happiness
)。
但是异常告诉你目标视图控制器只是普通的HappinessViewController
。所以即使你认为你做了,你可能不在故事板中设置了视图控制器的自定义类。也许您设置了一些其他视图控制器的自定义类,但是您没有设置此segue目标的类。
您需要在Identity Inspector中设置目标视图控制器的自定义类,如下所示:
答案 1 :(得分:7)
我弄明白了这个问题。虽然我已正确指定相关的UIViewController是HappinessViewController,但是链接器由于某种原因而没有链接到正确的文件。解决方法是双击Xcode中的.xcodeproj文件,然后转到Build Phases并手动添加“Compile Sources”下的文件。
答案 2 :(得分:4)
我改变了故事板中视图控制器的类。
答案 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的类