-1

このコードを作成しているときに、無効な整数からポインターへの変換について警告が表示されます。しかし、アプリケーションを実行すると、クラッシュが発生します....。

誰か助けてもらえますか...withObject:[sendertag]で警告が表示されます

(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]performSelector:withObject:afterDelay:はNSIntegerであり、そこにオブジェクトを期待しているため、渡すことはできません。できることは、次のような関数を呼び出すことです。

[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のタグ属性は単純な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を持っています、それはあなたの関数への送信者パラメータです。これを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)];
        }
    }
}

ここでは、ボタンごとに2つの新しいメソッドを作成しましたが、どちらにも引数がないため、withObjectを渡す問題が解決されました。

于 2011-07-29T06:56:38.147 に答える