从实用程序应用导航控制器视图发送到实例错误的无法识别的选择器

Posted

技术标签:

【中文标题】从实用程序应用导航控制器视图发送到实例错误的无法识别的选择器【英文标题】:Unrecognized selector sent to instance error from Utility App navigation controller view 【发布时间】:2011-12-06 12:13:54 【问题描述】:

我有一个实用程序。我在另一面实现了这段代码,它调用一个反馈视图来发送电子邮件,比如tutorial。这行得通,但是当我点击发送反馈 UIButton 时,我的应用程序立即崩溃并显示 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController sendMail]: unrecognized selector sent to instance 0x89c1960'.

我已经检查了这些东西:

我已经正确声明了委托并为 MailComposer 实现了它。

我的方法 sendMail 连接到按钮的 TouchUp 事件。

我的方法名称同意:

- (IBAction)sendMail;

- (IBAction)sendMail 

if ([MFMailComposeViewController canSendMail]) 

    MFMailComposeViewController *mfViewController = [[MFMailComposeViewController alloc] init];
    mfViewController.mailComposeDelegate = self;

    [self presentModalViewController:mfViewController animated:YES];


else 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status:" message:@"Your phone is not currently configured to send mail." delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];

    [alert show];

代码没有到达这个方法,因为我在方法实现的顶部设置了一个断点,但没有被调用。 ViewDidLoad 处的断点也没有被激活。

仔细查看这个错误:

reason: '-[UIViewController sendMail]: unrecognized selector sent to instance 

它似乎需要一个名为 sendMail 而不是方法的视图控制器。我读过这个post,它看起来非常相似,但我在 xib 身份下拉列表中没有看到任何其他视图控制器名称。我认为这是我的问题的一部分,但我不知道如何解决它。

也许我应该通过视图控制器展示 MFMailComposer?如果是这样,我不知道该怎么做。

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

您错误地将类型 UIViewController 分配给您的自定义视图控制器。您应该选择实际应用于您的自定义视图控制器的类类型(包含方法实现 sendMail 的类类型)。

您的代码/设置的问题在于您的自定义视图控制器被实例化为UIViewController 类型。但是,UIViewController 没有实现任何名为 sendMail 的方法,因此会出现异常。

由于您没有指定自定义视图控制器的类名,因此为了这个答案,我将简单地假设一个; MyCustomViewController

由于您似乎使用 InterfaceBuilder 来设置这些东西,因此请使用它将视图控制器的类型更改为 MyCustomViewController

编辑

从您的 cmets 中,我可以看到您实际上使用代码实例化了视图控制器。在这种情况下,请用以下方式替换您的方式:

MyCustomViewController *controller = [[MyCustomViewController alloc] initWithNibName:@"ExMobSendFeedback" bundle:nil]; 
controller.title = @"Feedback"; 
[self.navigationController pushViewController:controller animated:YES];
[controller release];

【讨论】:

是的,我正在使用 IB 来设置所有内容。当我突出显示我的视图时,我在身份选项卡上的自定义类类列表中没有看到我的视图控制器名称 (XMSendMail)。我还应该做些什么来让视图控制器在那里列出吗?顺便说一句,我通过添加新文件创建了 XMSendMail 视图控制器。谢谢 只需在名为:自定义类下的类的字段中输入即可。 这不起作用,它发出哔哔声并且不接受该名称。视图控制器是通过以下方式以编程方式创建的: UIViewController *controller = [[UIViewController alloc] initWithNibName:@"ExMobSendFeedback" bundle:nil];所以也许这就是它没有出现在班级列表中的原因。但是,文件(.h、.m、.xib)现在确实存在。顺便说一句,感谢您与我合作。 controller.title = @"反馈"; [self.navigationController pushViewController:controller animated:YES]; 好的进展。我接受了您的修改并在程序中对其进行了更改并为其导入了头文件,并且没有产生任何错误。但是,我注意到视图控制器名称仍然没有出现在类列表中。那时我注意到我在 xib 的对象列表中并没有真正的视图控制器,只有视图和按钮。所以我添加了一个视图控制器,在那里看到了 ExMobSendMail 名称并运行了应用程序。它像冠军一样工作 - 感谢 Till 的帮助。

以上是关于从实用程序应用导航控制器视图发送到实例错误的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:“无法识别的选择器已发送到实例”错误

Swift UITableView 无法识别的选择器发送到实例

performSegueWithIdentifier 处的“无法识别的选择器发送到实例”

无法识别的选择器已发送至实例:

应用程序崩溃,无法识别的选择器发送到实例 - 可能是骗局

-[UIView setRegion:animated:]: 无法识别的选择器发送到实例