2013-05-09 5 views
1

J'ai créé une fenêtre simple dans le but d'être quelque chose comme un «Assistant» (je sais que les directives d'Apple vous interdisent fondamentalement, j'ai essayé de convaincre le client, mais peu importe.)Changer de vue les repositionne à (0,0)

Il est juste une vue simple avec deux vues personnalisées à l'intérieur, l'un dans la partie inférieure qui contient un bouton « précédent » et « suivant », et une plus grande vue au sommet qui prend la majeure partie de l'espace.

J'ai appelé la vue du bas "NavigationView" et le premier "ContainerView"

J'ai créé un tableau pour contenir une série de vues que l'utilisateur est censé naviguer e avec les boutons "suivant" et "précédent".

Alors, voici mon code.

- (IBAction) next:(id)sender{ 
    currentViewIndex++; 
    [self animatePushView:YES]; 
} 

- (IBAction)previous:(id)sender{ 
    currentViewIndex--; 
    [self animatePushView:NO]; 
} 

- (void) animatePushView:(BOOL)forward{ 
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex]; 

    for (NSView *subView in [containerView subviews]) { 
     [subView removeFromSuperview]; 
    } 

    [containerView addSubview:nextView]; 
    [nextView setFrame:containerView.bounds]; 

    [containerView setNeedsDisplay:YES]; 

} 

C'est assez simple je pense. J'ai un tableau qui contient la vue suivante à afficher.

Ce qui se passe est que je trouve la vue suivante centrée dans la partie inférieure gauche de ContainerView. Pourquoi cela arrive-t-il? De plus, comme vous l'avez peut-être deviné, je suis un novice dans la gestion des vues, même si je travaille sur l'objectif-c depuis un certain temps, donc s'il y a des bonnes pratiques, je suis absent, je suis ouvert aux suggestions. Merci!

EDIT:

J'ai oublié d'ajouter: Certaines de ces vues ont des tailles différentes, et je voudrais être en mesure de changer la taille de la fenêtre en fonction de la taille de la vue.

Répondre

0

Ok, j'ai tout compris .. Enfin ..

Le problème était que la première vue que je devais montrer était déjà contenue dans la vue du conteneur dans le fichier .xib. Je ne sais pas vraiment pourquoi, mais cela a probablement causé quelques problèmes avec le nombre de retenues de la vue du conteneur, car il a été libéré lors du premier clic. Le fait de relâcher la vue du conteneur repositionnerait la vue sur (0,0) probablement parce que son cadre était nul, et la vue flasherait parce qu'elle n'était pas conservée correctement.

Supprimer la vue du fichier .xib et l'ajouter via le code fonctionne correctement quand même.

1

[nextView setFrame:containerView.bounds];

Vous assignez vue conteneur bornes à la prochaine vue cadre (doc).
Ce que vous voulez probablement est l'attribution de la vue actuelle cadre à la vue suivante cadre, et éventuellement ajuster la largeur et la hauteur.

Gardez une référence à la vue affichée actuelle, quelque chose comme ça (_currentView est un Ivar de type NSView *):

- (IBAction) next:(id)sender{ 
    currentViewIndex++; 
    [self animatePushView:YES]; 
} 

- (IBAction)previous:(id)sender{ 
    currentViewIndex--; 
    [self animatePushView:NO]; 
} 

- (void) animatePushView:(BOOL)forward{ 
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex]; 
    [nextView setFrame:_currentView.frame]; 

    [_currentView removeFromSuperview]; // _currentView is retained in the collection 
    [containerView addSubview:nextView]; 
    _currentView = nextView; 

    [containerView setNeedsDisplay:YES]; 
} 
+0

J'ai essayé votre code, et tout comme le mien, il ne fait que clignoter la vue dans le coin inférieur gauche de la fenêtre. Après ce clignotement, la vue disparaît. Je suppose qu'il doit y avoir un autre problème avec mon code. Peut-être que les vues ne sont pas correctement conservées? Modifier: J'ai déclaré les vues en tant que propriétés conservées. C'est le seul changement que j'ai fait, et maintenant les vues clignotent comme avant, mais au moins elles clignotent dans leur position correcte. – XelharK

+0

Vous ne savez pas si le problème de positionnement est dû au fait que les vues ne sont pas conservées correctement. dans la collection. Le cadre de vue est exprimé dans le système de coordonnées parent, une fois que vous avez correctement positionné une vue dans la vue du conteneur, il est facile de définir le même cadre sur la vue suivante. Mais nous n'avions qu'une petite partie du code entier. Le problème de clignotant ne sonne pas bien, vous libérez vos points de vue après chaque changement? – Vince

+0

Non, pas du tout. C'est en fait tout le code qui utilise ces vues, je ne les référence dans aucune autre partie de mon code. J'ai ajouté une autre réponse que j'ai trouvée, peut-être que cela a quelque chose à voir avec le nombre de retenues? – XelharK

Questions connexes