0

我一直在试图找出一些可能很明显的东西,但我错过了重点或失去了重点。XCode 没有看到的 toggleStormButtons 函数有问题吗?

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

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

然后在另一个类中,我有 2 个功能:

- (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
4

2 回答 2

2

听起来您的 STopLeftMenu 被释放得太早了。该按钮不保留其目标,因此只要该对象需要响应按钮的消息,您就需要保留该对象。如果您不确定对象是如何被释放的,请尝试使用 Instruments 进行调试

于 2013-07-31T00:27:57.403 回答
1

我认为您显示的代码没有任何问题。我在我现有的应用程序中尝试了它,虽然我必须 a) 声明一个 UIButton 局部变量,b) 更改用于按钮的图像和 c) 注释掉其中的内容toggleStormButtons,但每次点击按钮时都会调用该方法, 没问题。

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

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

于 2013-07-31T00:16:56.830 回答