-1

当我构建此代码时,我收到警告说无效的整数到指针的转换。但是当我运行应用程序时,它会崩溃......

任何人都可以帮助我...我在 withObject:[sender tag] 收到警告

我有接受(NSIngeter)参数的frontButtonScaleUp方法......并且标签也返回NSInteger值......

- (IBAction)frontButtonReleased:(id)sender
{
    const double delay = 0.3;
    double elapsed = CACurrentMediaTime() - tapStartTime;;
    if (elapsed >= delay)
        [self frontButtonScaleUp:[sender tag]];
    else
        [self performSelector:@selector(frontButtonScaleUp) withObject:[sender tag] afterDelay:delay - elapsed];
}
4

4 回答 4

5

[sender tag]是一个 NSInteger 并且您不能将它传递给它,performSelector:withObject:afterDelay:因为它期望那里有一个对象。你可以做的是这样调用函数:

[self performSelector:@selector(frontButtonScaleUp) withObject:[NSNumber numberWithInt:[sender tag]] afterDelay:delay - elapsed];

或尝试

[self performSelector:@selector(frontButtonScaleUp) withObject:(id)[sender tag] afterDelay:delay - elapsed];

我不确定其中任何一个,但请让我知道这是否有效。

于 2011-07-22T11:27:54.117 回答
0

您将无法像在代码中那样获得按钮的标签。这样做获取按钮然后使用它,您的问题将得到解决

- (IBAction)frontButtonReleased:(id)sender
{

UIButton *button = (UIButton *)sender;
        int Btag = button.tag;

const double delay = 0.3;
double elapsed = CACurrentMediaTime() - tapStartTime;;
if (elapsed >= delay)
    [self frontButtonScaleUp:Btag];
else
    [self performSelector:@selector(frontButtonScaleUp) withObject:Btag afterDelay:delay - elapsed];
}
于 2011-07-22T12:09:37.087 回答
0

嗯,不知道你的方法frontButtonScaleUp做了什么,我无法给出明确的答案,但我可以告诉你—— NSView 的tag属性是一个简单的 int ,不能保证它是一个有用的值。它是类的一个便利属性,让开发人员可以随心所欲地使用。绝不应将此属性与指针混淆为形状或形式!

在这行代码上:

if (elapsed >= delay) 
    [self frontButtonScaleUp:[sender tag]];

我无法真正发表评论,因为就像我说的那样,我不知道frontButtonScaleUp的定义或实现是什么。但我猜你期待某种类型的id并传入一个 int 。你的代码几乎肯定会在这里炸毁,如果你不走运,它会随机炸毁。

这一行:

else 
    [self performSelector:@selector(frontButtonScaleUp) withObject:[sender tag afterDelay:delay - elapsed];

绝对是错误的——再一次, int != id

我猜你想在某个延迟后点击按钮后增加按钮的大小?您已经有了按钮的 id,它是您函数中的sender参数。只需将它传递到您的frontButtonScaleUp方法中,您就应该可以通过编译器警告和 *EXC_BAD_ACCESS* 异常。

if (elapsed >= delay) 
    [self frontButtonScaleUp:[sender]];
于 2011-07-22T12:49:01.337 回答
-1

我对我的代码进行了一些修改,如下所示:

- (IBAction)frontButtonReleased:(id)sender
{
    const double delay = 0.4;
    double elapsed = CACurrentMediaTime() - tapStartTime;;
    UIButton *btn = (UIButton *)sender;

    if (isBtnOneTurnOver || isBtnTwoTurnOver)
    {
        if ([btn tag] == 1)
        {
            if (elapsed >= delay)
                [self btnOneScaleUp];
            else
                [self performSelector:@selector(btnOneScaleUp) withObject:nil afterDelay:(delay - elapsed)];
        }
        else
        {
            if (elapsed >= delay)
                [self btnTwoScaleUp];
            else
                [self performSelector:@selector(btnTwoScaleUp) withObject:nil afterDelay:(delay - elapsed)];
        }
    }
}

在这里,我为每个按钮创建了两个新方法,并且都没有参数,所以......传递 withObject 的问题得到了解决......

于 2011-07-29T06:56:38.147 回答