SDK 3.0 : Mes problèmes de compatibilité

bnkbnk Membre
juin 2009 modifié dans Apple Developer Programs #1
Bonjour,

De mon coté j'ai des problèmes de compatibilité pour un tableViewCell et une animation.

J'avais parfois des warnings en 2.2.1 parfois pas quoi qu'il en soit mon projet fonctionnait bien.
Ce sont des warnings "distinct Objective-C type.", en cherchant sur google, j'ai compris que c'était juste parceque je balance pas le type d'objet attendu mais comme ça fonctionnait quand même...

Dois-je absolument les corriger? (il y en a 3 parceque je passe une UIImage en subView à  la place d'une view).

Bref en OS3, j'ai des problèmes d'affichage.

* animation permettant de laisser plus longtemps l'image d'intro fonctionne mal : mon image est décalée d'environ 20 pixels vers le haut. (c'est ici que je passe une UIImage à  la place d'une view)

* Cells: le texte est décalé dans ma cell par rapport à  l'OS 221 d'environ 30 pixels vers la droite.
En OS 2.2.1 : CGRect contentRect = CGRectMake(0, 0.0, 230, 43);
En OS 3.0    : CGRect contentRect = CGRectMake(30, 0.0, 260, 43);


-> si le problème perssiste, je bricolerai en utilisant le test de muqaddar

#ifdef __IPHONE_3_0



Voici mes warnings:
<br />//animation permettant d&#39;afficher plus longtemps le Default.png<br />	imagePresentation = [[[UIImageView alloc] autorelease] initWithImage:[UIImage imageNamed:@&quot;Default.png&quot;]];<br />	[tabBarController.view addSubview:imagePresentation];<br />//warning: passing argument 1 of &#39;addSubview:&quot; from distinct Objective-C type.<br />&nbsp; &nbsp; [UIView beginAnimations:@&quot;ImagePresentation&quot; context:nil];<br />&nbsp; &nbsp; [UIView setAnimationBeginsFromCurrentState:YES];<br />&nbsp; &nbsp; [UIView setAnimationDelegate:self];<br />&nbsp; &nbsp; [UIView setAnimationDidStopSelector:@selector( removeDefaultView: )];<br />&nbsp; &nbsp; [UIView setAnimationDelay:1.0];<br />&nbsp; &nbsp; [UIView setAnimationDuration:1.5];<br />&nbsp; &nbsp; [imagePresentation setAlpha:0.0];<br />//warning &#39;UIImage&#39; may not respond to &#39;-setAlpha&#39;<br />&nbsp; &nbsp; [UIView commitAnimations];<br /><br />//plus loin dans le code<br />[imagePresentation removeFromSuperview];<br />//warning: &#39;UIImage&#39; may not respond to &#39;-removeFromSuperview&quot;<br />


Merci

Réponses

  • AliGatorAliGator Membre, Modérateur
    06:55 modifié #2
    ??? C'est quoi cet appel à  "autorelease" sur ton objet entre le "alloc" et le "init" ? C'est méga pas standard.... et sans doute la raison du warning
    Les deux autres warnings qui suivent montrent qu'il croit que imagePresentation est une UIImage et non une UIImageView : le "from distinct objective-C type" montre qu'il pense que ton argument n'est pas une UIImageView (alors que c'est ce qu'il attend) et le warning suivant dit que "UIImage may not respond to setAlpha" montrant qu'il pense que imagePresentation est une UIImage.
    Donc tous ces warnings sont à  mon avis dus au fait que tu ne respectes pas les règles de base classiques de gestion mémoire et l'ordre habituel des appels de méthodes.

    Sinon dans la 2e partie le warning sur le "assignment from distinct Objective-C type" sur "viewWithTag" est normal par contre : viewWithTag retourne un objet UIView non spécialisé. Et toi tu l'affectes à  une variable de type UILabel. Certes UILabel est une sous-classe de UIView, et surtout vu comment tu as créé ton label et affecté son tag dans le "if", tu sais que c'est un UILabel. Mais le compilateur ne peux pas le savoir, tout ce qu'il sait c'est que viewWithTag retourne une UIView générique, et pas forcément une UIView qui se trouve être plus précisément un UILabel.
    Si tu veux enlever ce warning, il faut effectuer un cast (transtypage) explicite sur le retour de viewWithTag pour le transtyper en UILabel. C'est ce qui est conseillé dans la doc sur les UITableViewCells Programming Guide d'ailleurs.

    Enfin, en OS 3.0, le initWithFrame: reuseidentifier est deprecated (ça m'étonne que tu n'aies pas eu de warning dessus), il faut utiliser [tt]initWithStyle:reuseidentifier:(/tt] si je ne m'abuse. Et là  l'utilisation d'un #ifdef __IPHONE_3_0 comme j'avais précaunisé à  muqaddar te sera du coup nécessaire.
  • bnkbnk Membre
    06:55 modifié #3
    Merci tout est corrigé mis à  part le problème avec mon animation.

    Voici en vidéo ce que ça fait:
    http://bnka.free.fr/beurdel/bugOS3.mov

    J'ai essayé en ajoutant 10px de hauteur à  mon imageView affichée pour tricher un peu mais rien n'y fait, cette UIImageView n'est pas correctement ajoutée en subview.

    <br />	//animation permettant d&#39;afficher plus longtemps le Default.png<br />	imagePresentation = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;Default.png&quot;]];<br />	[tabBarController.view addSubview:imagePresentation];<br />&nbsp; &nbsp; [UIView beginAnimations:@&quot;ImagePresentation&quot; context:nil];<br />&nbsp; &nbsp; [UIView setAnimationBeginsFromCurrentState:YES];<br />&nbsp; &nbsp; [UIView setAnimationDelegate:self];<br />&nbsp; &nbsp; [UIView setAnimationDidStopSelector:@selector( removeDefaultView: )];<br />&nbsp; &nbsp; [UIView setAnimationDelay:1.0];<br />&nbsp; &nbsp; [UIView setAnimationDuration:1.5];<br />&nbsp; &nbsp; [imagePresentation setAlpha:0.0];<br />&nbsp; &nbsp; [UIView commitAnimations];<br />	[imagePresentation release];<br />
    


    Est-ce un bug de cette beta de l'OS3 ?
    Ce code fonctionne parfaitement en OS 2.2.1.
  • bnkbnk Membre
    juin 2009 modifié #4
    Un autre bug trouvé: impossible de scroller dans mes UITextView sous l'OS3.

    EDIT:
    Solution: cocher la case "Cancellable Content Touches" sous IB dans theUITextView inspector.
  • bnkbnk Membre
    juin 2009 modifié #5
    Solution pour le problème avec mon animation:

    En fait lorsqu'on ajoute une subview avec l'OS 3, le CGRectMake commence vraiment au bord de l'écran et non en dessous de la status bar comme dans l'OS 2.2.1.

    Du coup il faut décaler la view de 20 pixels (hauteur de la status bar) vers le bas sur l'axe Y.

    CGRectMake (0.0f, 20.0f, 320.0f, 460.0f)];

  • bnkbnk Membre
    juin 2009 modifié #6
    Bonjour,

    Je me pose une question:

    Je dois faire une suite d'applications qui ont la même architecture, seul leur contenu change (ce contenu est chargé via des fichiers xml).

    Comment construire cette suite d'applications le plus simplement possible?
    Ca revient à  dire : comment est identifié une application?
    Est-ce le bundle identifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier})?

    L'idée est de simplement copier/coller mon application #1, et de changer juste le bundle identifier pour l'application #2.
    Ca évite de créer un nouveau projet, de réimporter les framework et de changer les imports "nomApplicationAppDelegate.h" dans les class qui s'en servent.
    Car si je c/c mon application #1 pour changer le contenu des xml dans mon application copiée et que je le lance cette application #2 sur mon simulateur, l'application #1 va être écrasée.
  • AliGatorAliGator Membre, Modérateur
    06:55 modifié #7
    Oui pour moi c'est avec le BundleIdentifier. Il suffit donc à  priori de changer le PRODUCT_NAME dans tes Build Settings. Après, Il suffit de tester dans le simulateur ;)
  • bnkbnk Membre
    06:55 modifié #8
    C'était bien ca qu'il fallait changer ;)
Connectez-vous ou Inscrivez-vous pour répondre.