【问题标题】:Unrecognised selector on button press按下按钮时无法识别的选择器
【发布时间】:2012-07-01 19:16:28
【问题描述】:

我不敢相信我会在这么简单的事情上磕磕绊绊:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button setTitle:@"Tap me" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];

        button.frame = CGRectMake(50, 50, 120, 60);
        [self.view addSubview:button];

    }
    return self;
}

-(void)test {
    NSLog(@"Test");
}

当我按下按钮时它会崩溃,并出现unrecognized selector sent to instance 错误。

有人知道我在这里做错了什么吗?

编辑 - 错误信息:

-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30'

编辑 - 它的呈现方式 (ARC):

DemoViewController *demoVC = [[DemoViewController alloc] init];
    [self.window addSubview:demoVC.view];

    [self.window makeKeyAndVisible];

【问题讨论】:

  • 能否请您发布确切的错误代码?
  • 您是否在 .h 文件中声明了 test
  • 是的,它已经在那里声明了,尽管这应该没什么区别。
  • @WendiKidd - 是否声明都没关系。 Obj-C 是一种动态语言,声明只是为了欺骗编译器。如果方法已实现,则运行时确实识别选择器。
  • 顺便说一句,您确定您实现了-test 而不是-test: 或其他方式吗?

标签: iphone objective-c ios button


【解决方案1】:

如果你使用 ARC,那么 demoVC.view 将在函数结束后立即被重新调用,而不是像这样初始化

DemoViewController *demoVC = [[DemoViewController alloc] init];

围绕 demoVC 创建一个强大的属性并将其初始化为 this

self.demoVC = [[DemoViewController alloc] init];

【讨论】:

    【解决方案2】:

    您的错误消息表明(很可能)您的视图控制器在按下按钮之前被释放。 (这表明消息正在发送到一个 NSString,它可能正在占用视图控制器曾经所在的内存。)

    找出这个问题的最简单方法是使用zombies 来确认这一点并确定您的对象被提前释放的原因。

    编辑:根据您的演示代码,您应该例如创建一个实例变量来保留对您的视图控制器的引用。您可能还希望将您的按钮初始化代码移动到viewDidLoad 以避免将来出现其他问题。 (或者把按钮挂在笔尖上!)

    【讨论】:

      【解决方案3】:

      当添加任何带有代码的 UI 组件时,它需要在 viewDidLoad 或 loadView(如果你不添加 xib 文件)覆盖方法中添加。

      您还需要为发件人添加参数(这是推荐)

      ex ) - (void)test:(id)sender

      并像这样添加目标.... [button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside]

      【讨论】:

        【解决方案4】:

        您可能会在代码中的某处为 NSString 调用“测试”方法。

        【讨论】:

        • ...什么?你能进一步解释你的答案吗?
        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多