UIButton 的 IBAction 导致无法识别的选择器发送到实例错误 (iOS)

Posted

技术标签:

【中文标题】UIButton 的 IBAction 导致无法识别的选择器发送到实例错误 (iOS)【英文标题】:IBAction for UIButton Causes an unrecognized selector sent to instance error (iOS) 【发布时间】:2011-11-19 23:49:52 【问题描述】:

在我的标签栏应用程序中使用某些 UIButton 调用操作时遇到问题。

我的 .h 文件:

#import <UIKit/UIKit.h>

@interface ContactViewController : UIViewController 
    UIButton *callTollFreeButton;
    UIButton *callLocalButton;
    UIButton *emailButton;


@property (nonatomic, retain) IBOutlet UIButton *callTollFreeButton;
@property (nonatomic, retain) IBOutlet UIButton *callLocalButton;
@property (nonatomic, retain) IBOutlet UIButton *emailButton;

-(IBAction)callPhone:(id)sender;
-(IBAction)callTollFree:(id)sender;
-(IBAction)clickEmailButton:(id)sender;
@end

我的 .m 文件:

#import "ContactViewController.h"

@implementation ContactViewController
@synthesize callLocalButton,callTollFreeButton,emailButton;

-(IBAction)callPhone:(id)sender 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:7576236600"]];


-(IBAction)callTollFree:(id)sender
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:8003334645"]];


-(IBAction)clickEmailButton:(id)sender
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:email@email.com?subject=Hello"]];    


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) 
    // Custom initialization
    
return self;


- (void)dealloc

[callLocalButton release];
[callTollFreeButton release];
[emailButton release];
[super dealloc];


- (void)didReceiveMemoryWarning

// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.


#pragma mark - View lifecycle

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view from its nib.


- (void)viewDidUnload

[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);


@end

我的 .m 文件:

我收到的错误消息是(我收到任何点击按钮的错误消息,特别是点击电子邮件按钮):

2011-11-19 18:39:38.786 Miller Tab Bar[761:207] -[UIViewController clickEmailButton:]: unrecognized selector sent to instance 0x6b29f40
2011-11-19 18:39:38.790 Miller Tab Bar[761:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController clickEmailButton:]: unrecognized selector sent to instance 0x6b29f40'

我尝试将出口和操作连接并重新连接到视图控制器上的对象。是否有可能因为 SDK 无法运行测试电话或电子邮件而崩溃?

我在调试器中输入了“po 0x6b328d0”以找出问题对象是什么,它以 UIViewController 的形式返回,这可能意味着视图控制器在调用操作之前已被释放?是什么原因造成的?

谢谢。


【问题讨论】:

【参考方案1】:

在您的 Nib 或情节提要中,您的视图控制器实例的类型似乎是 UIViewController 而不是 ContactViewController。

因此,在您的 Nib(或故事板)中选择视图控制器,并将其类型更改为 ContactViewController。

当然,如果此视图控制器不是从 nib 或情节提要加载的,那么只需检查您创建它的位置并确保您创建了正确类的实例。

【讨论】:

我为 ContactViewController.xib 添加了一张 Interface Builder 的图片(上图),它似乎设置正确(我把它弄糊涂了,它实际上看起来不像哈哈)。你说的是这个吗? 我一直在使用界面生成器,所以当我点击标签栏按钮时,笔尖刚刚被加载。当我点击 emailButton 时发生错误,而不是在加载 nib 时发生。 不,问题出在创建或加载视图控制器时。当您尝试使用按钮时,您稍后会注意到它。我的猜测是标签栏控制器正在加载 UIViewController,而不是这个视图控制器。 UITabBarController 在哪里?您还没有为此显示代码或 nib。 是的,是的。谢谢你。我想到了。我将其追溯到标签栏,并发现我需要在界面构建器中针对该按钮进行一些调整。基本上,我让标签栏按钮加载一个单独的 XIB 文件,而不是在标签栏应用程序的视图控制器上将其构建为“视图”(如果这有意义,那是一种复杂的解释方式)。无论如何,非常感谢!【参考方案2】:

这有点奇怪。我认为您的视图控制器设置不正确。

奇怪的是,如果设置不正确,您将无法设置操作(文件所有者-ContactViewController)

当我将无法识别的选择器发送到自定义 ViewController 时,它会说

-[customViewController foo]:无法识别的选择器发送到实例 0x6a2b440

似乎 xib 的实际文件所有者被实例化为 UIViewController

【讨论】:

我遇到了这个问题。我使用UIViewController(nibName: "MyViewController", bundle: Bundle.main) 而不是MyViewController(nibName: "MyViewController", bundle: Bundle.main)。谢谢!【参考方案3】:

尝试改变:

UIButton *callTollFreeButton;
UIButton *callLocalButton;
UIButton *emailButton;

IBOutlet UIButton *callTollFreeButton;
IBOutlet UIButton *callLocalButton;
IBOutlet UIButton *emailButton;

并将UILabels 连接到各自的按钮。看看是否有帮助。

【讨论】:

没有改变任何东西。我已经以这种方式设计了一段时间,并且之前它可以工作,所以我不确定它是否可能与视图控制器之外的代码有关?我一直在研究调试,但找不到任何指向正确方向的东西。 在设备上试一试,您可能对无法在 sim 上使用有所了解。 我想知道无法识别的选择器是“tel:”还是“mailto:”。我会继续尝试更深入地调试,看看它是否指向正确的方向。 @MxmastaMills 我对此表示怀疑,无法识别的选择器意味着您正在向不存在的对象发送命令,反之亦然。 我刚刚在调试器中运行了“po 0x6b328d0”,它识别出无法识别的选择器为 UIViewController,这可能意味着视图控制器在调用操作之前已被释放?

以上是关于UIButton 的 IBAction 导致无法识别的选择器发送到实例错误 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 IBAction 添加到 UIButton

按下 UIButton 会导致无法识别的选择器错误

按钮 IBaction 连接显示未知符号和应用程序将异常无法识别的选择发送到实例

-[UIButton _layoutAttributes]:发送到实例的无法识别的选择器

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

使用带有两个参数的 UIButton addTarget 时无法识别的选择器