2012-01-23 2 views
4

J'ai des problèmes avec setNeedsDisplay. J'ai un UIView avec beaucoup de sous UIViews, créés dans Inteface Builder. J'ai aussi un bouton avec IBAction. Dans cette IBAction je veux redessiner/recharger tous les UIViews (ou tous UIElements, comme UILabel, UIWebView et ainsi de suite ..)recharger/rafraîchir subViews - setNeedsDisplay ne fonctionne pas

Je fais cela, qui ne fonctionne pas pour moi, ne sais pas pourquoi ..:

//redraw the UIViews 
[self.view_card_0 setNeedsDisplay]; 
[self.view_card_1 setNeedsDisplay]; 
[self.view_card_stapel setNeedsDisplay]; 

//other UI Elements 
[self.webView_0 setNeedsDisplay]; 
[self.webView_1 setNeedsDisplay]; 
[self.webView_stapel setNeedsDisplay]; 

[self.lblCardTitle_0 setNeedsDisplay]; 
[self.lblCardTitle_1 setNeedsDisplay]; 
[self.lblCardTitle_stapel setNeedsDisplay]; 

[self.img_card_0 setNeedsDisplay]; 
[self.img_card_1 setNeedsDisplay]; 
[self.img_card_stapel setNeedsDisplay]; 

Que faire pour redessiner/reload/actualiser tous les UIElements/UIViews et subviews?

EDIT 1:

Comment je charge la vue:

detailViewController = [[DetailViewController alloc] 
initWithNibName:@"DetailViewController_iPad" bundle:[NSBundle mainBundle]]; 

Le detailviewcontroller n'a pas viewcontroller, juste UIViews, voici la hierarchie:

  • UIView
    - UIViewContainer
    --- --- UIView0
    UIView1
    --- UIViewStapel

Ce que je pense à faire:

* Je ne veux pas réinitialiser le UIView, je veux changer la contexte et le contenu d'entre eux. *

J'ai dans mon detailview beaucoup de sous-vues (uiviews), voir ci-dessus hierarchie. J'affiche du contenu dans les UIViews, le contenu provient de CoreData.
La vue1 contient la ligne actuelle de coreData.
La vue0 contient la ligne précédente de coreData.
Le viewStapel contient la ligne suivante de coreData.

Avec IBAction je veux itérer les lignes CoreData, afficher la ligne suivante en cours si l'action est called..and ainsi de suite ..

Connexion, les données sont modifiées, mais pas affiché dans la UIViews . A cause de cela j'ai besoin d'un redessiner ou recharger ou quelque chose comme ça, pour afficher les données actuelles.

EDIT 2: SOLVED
J'ai mis le code dans une nouvelle méthode et d'appeler cette méthode a résolu mon problème.

+0

Pourquoi fais-tu cela? Qu'attendez-vous qu'il fasse? En général appeler '-setNeedsDisplay' sur un autre élément de l'interface ne fera * rien *, car si l'élément de l'interface utilisateur doit mettre à jour son affichage (en réponse aux changements de propriétés), il aura déjà appelé cette méthode sur lui-même. –

+0

Je change le contenu et aussi la couleur/image sur cette IBAction. le contenu provient de CoreData. J'ai besoin de redessiner les uiviews pour afficher les changements sur ibaction. – brush51

+1

setNeedsDisplay ne fait que redessiner la vue, elle ne réinitialise pas ses propriétés (par exemple, la couleur). Pour ce faire, vous devrez les recharger à partir du fichier nib (voir la réponse ci-dessous). –

Répondre

17

Essayez-vous de réinitialiser votre vue et sous-vues à leur état par défaut dans le fichier nib?

Si tel est le cas, l'approche ci-dessus ne fonctionnera pas. La seule façon de le faire automatiquement est de recharger les vues de la plume, mais vous devez être plus clair sur la façon dont vous chargez la vue en premier lieu avant que je puisse vous aider.Si vous le chargez dans un contrôleur de vue, la manière la plus simple de l'actualiser est de supprimer le contrôleur de vue de l'écran et de le recréer, mais vous pouvez recharger la vue en disant quelque chose comme ça (de l'intérieur le contrôleur):

UIView *parent = self.view.superview; 
[self.view removeFromSuperview]; 
self.view = nil; // unloads the view 
[parent addSubview:self.view]; //reloads the view from the nib 

Si vous chargez la vue directement à partir d'une pointe à l'aide [[NSBundle mainBundle] loadNibNamed ...] ou équivalent, alors la meilleure façon de recharger la vue est tout simplement de le jeter et appel cette méthode à nouveau.

+0

Merci de votre réponse. Voir mon Edit1. J'ai expliqué un peu. – brush51

+0

On dirait que vous faites quelque chose de bizarre avec les contrôleurs de vue qui ne fonctionnent probablement pas comme vous le pensez. Vous dites que vous n'avez pas de contrôleur de vue, mais qu'est-ce que DetailViewController si ce n'est pas un contrôleur de vue? Je sais qu'il n'y a pas de contrôleur de vue dans le fichier nib car ce n'est pas comme ça que les nibs fonctionnent, mais vous créez toujours un contrôleur de vue et remplissez sa hiérarchie à partir d'une plume. –

+0

J'ai mis le code dans une nouvelle méthode et appeler cette méthode a résolu mon problème. Je vous remercie! – brush51

1

Cela peut aider quelqu'un, avec pagination dans une vue de conteneur. Le code ci-dessus m'a donné l'idée d'essayer cela et cela fonctionne.

[self.pageViewController.view removeFromSuperview]; 
self.pageViewController.view = nil; // unloads the view 
[self performSegueWithIdentifier:@"pageViewSegue" sender:self]; 
6

Swift 2

Ceci est une réplique de la réponse de Nick Lockwood pour une copie facile coller

let parent = self.view.superview 
self.view.removeFromSuperview() 
self.view = nil 
parent?.addSubview(self.view) 
Questions connexes