无法识别的选择器发送到另一个类的实例

时间:2013-07-30 23:41:15

标签: objective-c

我一直试图找出可能很明显的东西,但我忽略了这一点或失去了它。我的toggleStormButtons函数出了什么问题,XCode没有看到它?

在我的主类中,我有以下内容在另一个类中调用函数:

STopLeftMenu *mTopLeft = [[STopLeftMenu alloc]init];    
[mTopLeft drawStormToggleButton];

然后在另一个班级我有两个功能:

- (void)toggleStormButtons{
    [UIButton animateWithDuration:0.50 animations:^{
        if (stormToggleBtn.transform.tx == 0){
            [stormToggleBtn setTransform:CGAffineTransformMakeTranslation(307, 0)];
            UIImage* hideButtonImg = [UIImage imageNamed:@"aiga_right_arrow_mod_hide_resize.png"];
            [stormToggleBtn setBackgroundImage:hideButtonImg forState:UIControlStateNormal];
        }
        else{
            [stormToggleBtn setTransform:CGAffineTransformMakeTranslation(0, 0)];
            UIImage* showButtonImg = [UIImage imageNamed:@"aiga_right_arrow_mod_show_resize.png"];
            [stormToggleBtn setBackgroundImage:showButtonImg forState:UIControlStateNormal];
        }
    }];

    for(UIView* storm in stormButtonSaves){
        [UIView animateWithDuration:0.50 animations:^{
            if (storm.transform.tx == 0){
                [storm setTransform:CGAffineTransformMakeTranslation(307, 0)];
                storm.alpha = .65;
            }
            else{
                [storm setTransform:CGAffineTransformMakeTranslation(0, 0)];
                storm.alpha = 0;
            }
        }];
    }
}

- (void)drawStormToggleButton{
    //Storm Pullout Toggle Button
    UIImage *buttonImageNormal = [UIImage imageNamed:@"aiga_right_arrow_mod_show_resize.png"];
    stormToggleBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 65, 75) ];
    [stormToggleBtn setBackgroundImage:buttonImageNormal forState:UIControlStateNormal];
    stormToggleBtn.backgroundColor = [UIColor clearColor];
    stormToggleBtn.alpha = 0.5;
    [stormToggleBtn addTarget:self action:@selector(toggleStormButtons) forControlEvents:UIControlEventTouchUpInside];
    [viewsToRemove addObject:stormToggleBtn];
    [mv addSubview:stormToggleBtn];
}

我似乎得到了一个无法识别的选择器消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ toggleStormButtons]: unrecognized selector sent to instance 0x7bc9ca0'
*** First throw call stack:
(0x1b9e012 0x1966e7e 0x1c294bd 0x1b8dbbc 0x1b8d94e 0x197a705 0x8ae2c0 0x8ae258 0x96f021 0x96f57f 0x96e6e8 0x8ddcef 0x8ddf02 0x8bbd4a 0x8ad698 0x2599df9 0x2599ad0 0x1b13bf5 0x1b13962 0x1b44bb6 0x1b43f44 0x1b43e1b 0x25987e3 0x2598668 0x8aaffc 0x2285 0x2185)
libc++abi.dylib: terminate called throwing an exception

2 个答案:

答案 0 :(得分:2)

听起来你的STopLeftMenu过早被解除分配。该按钮不会保留其目标,因此只要需要响应按钮的消息,您就需要保留此对象。如果您不确定对象是如何解除分配的,请尝试debugging with Instruments

答案 1 :(得分:1)

我没有看到您显示的代码有任何问题。我在我现有的应用程序中试过它,但我必须a)声明一个UIButton局部变量,b)更改用于按钮的图像,c)注释toggleStormButtons中的内容,方法被调用每个我按下按钮的时间没有问题。

您没有显示按钮的存储空间。你在用ARC吗?是按钮strong?如果ARC它应该是强大的。如果不是ARC并且您没有使用属性来分配retain,则可能会导致问题。 viewsToRemove做什么?看起来像一个数组,但它可能是其他东西。

为什么不使用+ buttonWithType:并稍后设置框架?