2011-07-22 6 views
0

Lorsque je crée ce code, j'obtiens AVERTISSEMENT que INVALID est une conversion de nombre entier en pointeur. Mais quand je lance l'application, il obtient crash .....Invalide Conversion de nombre entier en pointeur dans l'objectif c

peut me aider ... Je reçois à l'avertissement withObject: [tag expéditeur]

j'ai frontButtonScaleUp méthode qui prend (NSIngeter) l'argument ... et retourne tag valeur 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]; 
} 

Répondre

0

J'ai fait mon travail avec peu de modifications du code comme ci-dessous:

- (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)]; 
     } 
    } 
} 

ici, je l'ai fait deux nouvelles méthodes pour chaque bouton et les deux ayant pas d'arguments ... donc que le problème de passage withObject was resolved ....

5

[sender tag] est un NSInteger et vous ne pouvez pas passer à performSelector:withObject:afterDelay: qu'il attend là un objet. Ce que vous pouvez faire est d'appeler la fonction comme ceci:

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

ou essayez

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

Je ne suis pas sûr de l'un d'eux, mais s'il vous plaît laissez-moi savoir si cela fonctionne.

+0

Bonne réponse. Le premier fonctionnera sûrement. +1 –

+0

+1 à la première réponse, -1 à la seconde; vous ne savez pas si le framework appellera 'retain' sur votre objet (qui si c'est juste un int échouera horriblement!) – deanWombourne

+0

Les deux solutions que j'ai essayées mais je ne reçois pas d'avertissements mais dans les premiers cas d'application de situation ... et dans la deuxième situation, j'ai eu erreur EXC_BAD_EXECUTION .... – DShah

0

Vous ne pourrez pas obtenir l'étiquette du bouton comme vous l'avez fait dans votre code. Faites comme cela pour obtenir le bouton puis l'utiliser, votre problème sera résolu

- (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]; 
} 
+0

J'ai utilisé le même code que vous avez donné mais je reçois toujours un avertissement à withObject: Incompatible entier à la conversion de pointeur envoi 'int' au paramètre de type 'id' ... Quelqu'un peut-il me dire ce que je devrais passer avecObjet ... ??????? – DShah

+1

Utilisez le type de données 'id' au lieu de int et utilisez-le comme; id Btag = button.tag; –

0

Hmmm, sans savoir ce que votre méthode frontButtonScaleUp ne, je ne peux pas donner une réponse définitive, mais je peux dire vous ceci - l'attribut tag d'un NSView est un int simple sans aucune garantie d'être une valeur utile. C'est un attribut de commodité sur la classe, donné aux développeurs d'utiliser à peu près ce qu'ils veulent. En aucun cas forme ou forme devrait cet attribut être jamais confondu avec un pointeur!

Sur cette ligne de code:

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

Je ne peux pas vraiment parce que, comme je l'ai dit, je ne sais pas ce que la définition ou la mise en œuvre de frontButtonScaleUp est. Mais je devine que vous attendez un id de quelque sorte et passant dans un int à la place. Votre code va presque sûrement exploser ici, si votre malchanceux va le faire au hasard.

Cette ligne:

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

est certainement mal - encore une fois, int = id!.

Im deviner que vous essayez d'augmenter la taille d'un bouton après avoir été tapoté, après un certain délai? Vous avez déjà l'identifiant du bouton, c'est le paramètre expéditeur dans votre fonction. Transmettez-le simplement dans votre méthode frontButtonScaleUp et vous devriez dépasser l'avertissement de votre compilateur et l'exception * EXC_BAD_ACCESS *.

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

Oui, je veux augmenter la taille du bouton. Donc, mon frontButtonScaleUp prend la référence du bouton puis j'utilise un code simple qui fonctionne sur un projet différent ... mais ici je veux 2 boutons pour utiliser le même code .. c'est pourquoi j'utilise l'expéditeur au lieu de la référence du bouton directement ... – DShah

+0

@Dhiren Shah - c'est ce que je pensais. Avez-vous essayé le code de ma réponse? Vous devriez être capable de simplement passer * sender * au lieu de * [sender tag] * et votre fonction fonctionnera. – Perception

+0

J'ai essayé avec Sender aussi mais quand mon code entre dans une autre partie .... mon application tombe en panne ... juste à cause de withObjects ... – DShah

Questions connexes