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 连接显示未知符号和应用程序将异常无法识别的选择发送到实例