2010-05-19 9 views
0

J'ai ces deux morceaux de code. Le premier fonctionne parfaitement:iPhone: [subview release] supprime ma sous-vue de l'affichage

UIView *tmp = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 60.0f, 296.0f, 44.0f)]; 
[self.dynamicView addSubview:tmp]; 
[tmp release]; 

Le second est à peu près le même, mais la vue n'apparaît pas.

CommentBox *commentBox = [[CommentBox alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 296.0f, 44.0f)]; 
[self.dynamicView addSubview:commentBox]; 
[commentBox release]; // Why does this remove the view? 

Si je supprime la [commentBox release] la vue apparaît étonnamment. Mais je ne vois pas de différence entre ces deux extraits de code.

init pour le CommentBox ressemble à ceci:

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // Load the nib: 
     NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil]; 
     self = [nibObjects objectAtIndex:0]; 

    } 
    return self; 
} 

Répondre

2

que vous faites des choses étranges dans -initWithFrame:. Je ne suis pas sûr à 100% que cela cause le problème que vous signalez, mais je suis sûr que c'est:

  • incorrect; et
  • provoquant une fuite de mémoire.

Je ne pense pas que le remplacement d'un objet vue avec quelque chose de désarchivé d'une plume dans ses méthodes -init… est une bonne idée. Chargez la plume à partir d'une classe de contrôleur ou demandez à votre initialiseur de charger les sous-vues de l'objet à partir de la plume sans remplacer self.

+0

Merci Graham. J'ai posté ma nouvelle solution ci-dessous. – znq

3

Après avoir réfléchi à la réponse de Graham je suis venu avec la solution suivante:

  1. je traîne une nouvelle UIView (-> Appelons ce sous UIView) dans Interface Builder dans mon principal UIView
  2. Je donne cette sous UIView la taille correcte (parce que je ne peux pas redimensionner la principale UIView, qui est toujours 320x460)
  3. Je fais glisser tous mes autres éléments dans ce sous UIView (de sorte que tous les éléments sont attachés à mon sous UIView)
  4. Je donne mon sous UIVvue d'un numéro de tag (Interface Builder -> Attribut de vue es), par ex. "300"
  5. Dans le code que je fais maintenant ce qui suit dans mon -initWithFrame:

    NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed: @ "CommentBox" propriétaire: auto Options: néant]; UIView * subView = [[nibObjects objectAtIndex: 0] viewWithTag: 300]; [self addSubview: subview];

Espérons que ça aide.


Mise à jour:

Je viens d'avoir une autre idée de le faire. Au lieu des numéros d'étiquettes, vous pouvez également créer un IBOutlet UIView *viewHolder dans la classe CommentBox et définir la sortie dans IB. Puis dans le initWithFrame: je fais ce qui suit:

[[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil]; 
[self addSubview:self.viewHolder];