3

J'essaie d'ouvrir une nouvelle vue sur la sélection d'une cellule de tableau dans une vue précédente. La nouvelle vue que j'essaie d'ouvrir, consiste en différentes sous-vues ou modules. Par conséquent, je remplis chaque sous-vue une par une à l'intérieur de la méthode [self populate] qui est déclenchée à l'intérieur de la méthode viewDidLoad.UIScrollView ne se met pas à jour correctement, affiche la vue vide de manière aléatoire

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    [self populate]; 
} 
-(void) populate{ 
    [self.edgeGallery loadImagesWithURLs: _items]; 

    // Modular view: main info 
    [self.vwListingMainView setListing: _listing]; 
    [self.vwListingMainView refresh]; 

    // Modular view: listing agents 
    _vwListingAgentsView.agentsArray = _listing.agents; 

    // Modular view: listing info 
    _vwListingInfoView.listing = _listing; 
    [_vwListingInfoView refresh]; 

    // Modular view: Listing activities 
    _vwListingActivityView.listing = _listing; 
    [_vwListingActivityView requestCounts]; 

} 

Chaque fois qu'une nouvelle sous-vue est peuplée, la méthode viewWillLayoutSubViews est appelée. C'est la méthode où je calcule la hauteur et les autres contraintes de la sous-vue et l'ajoute à la vue d'ensemble.

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [self computeAndFixHeight]; 
} 
- (void) computeAndFixHeight { 
    // Adjusting each module's height 
    _cstMainInfoHeight.constant = [_vwListingMainView getViewHeight]; 
    _cstListingActionsHeight.constant = [_vwListingActionsView getViewHeight]; 
    _cstListingAgentsHeight.constant = [_vwListingAgentsView getViewHeight]; 
    _cstListingInfoViewHeight.constant = [_vwListingInfoView getViewHeight]; 

    // Adjusting scroll view height 
    NSInteger computedScrollHeight = _vwListingUpcomingEventView.frame.origin.y + [_vwListingUpcomingEventView getViewHeight]; 

    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, computedScrollHeight)]; 
    _cstContainerBottom.constant = -computedScrollHeight - kDefaultNegativeScrollH; 

    [self.view layoutIfNeeded]; 
    [self.view updateConstraints]; 

} 

Cependant, une fois la vue est complètement chargée, le problème que je suis face est que parfois, je reçois la vue complète et parfois, au hasard , je reçois une vue vide. Je pense que [self.view layoutIfNeeded] est le problème, mais j'ai également essayé d'utiliser [self.view setNeedsLayout] et [self.view setNeedsUpdateConstraints], mais le problème persiste. Toute aide serait appréciée. S'il vous plaît excusez moi si je fais quelque chose de stupide. Je suis nouveau sur le développement iOS.

+0

Tout d'abord, vous devez appeler super dans viewDidLoad(): [super viewDidLoad]; – onnoweb

+0

Je pense que vous n'utilisez pas un UITableView. Il semble que vous utilisez juste un UIScrollView, non? Dans ce cas, si vous définissez correctement vos contraintes, il ne devrait pas être nécessaire d'implémenter 'computeAndFixHeight'. Regardez cette vidéo pour voir si vous avez bien défini vos contraintes: https://www.youtube.com/watch?v=4oCWxHLBQ-A – ghashi

+0

Je voudrais déplacer votre [auto-population]; méthode à afficherWillAppear –

Répondre

0

J'ai créé ce projet juste pour votre question de montrer comment mettre à jour un ScrollView juste en utilisant AutoLayout (pas besoin de passer outre viewWillLayoutSubviews, mettre à jour le scrollView's contentSize, appelez layoutIfNeeded ou updateConstraints)

Espérons que cela vous aide =)

https://github.com/ghashi/ScrollViewQuestion/tree/master

Ceci est le résultat:

shopping_list1

+0

@gashi ... Merci beaucoup de donner votre coup de main.Je vais certainement essayer et revenir vers vous dès que possible. – Ron

0

Dans notre projet, nous avions rencontré un problème similaire où nous devions ajouter beaucoup de vues à une vue de contenu d'un scrollview en utilisant des contraintes ajoutées par programmation. L'écriture de contraintes pour chaque vue n'a pas seulement fait gonfler le contrôleur de vue, elle était également statique. Pour ajouter une autre vue, nous avons dû réécrire les contraintes.

Nous finissons par créer une sous-classe de UIView qui gère maintenant cela pour nous. Nous l'avons nommé NNVerticalStackView.h,.m.

+0

Merci pour la mise à jour. Je prendrai note de cela et vous tiendrons au courant une fois que je l'aurai accompli. Encore merci. – Ron