2016-07-21 2 views
0

Je développe une application (par un tutoriel, mais le tutoriel est écrit pour Swift et j'apprends Objective-C. Tutoriel sourceiOS vues personnalisées ne montrent pas

Mais j'ai un problème, Je développe un contrôleur personnalisé (RatingController), qui fonctionne lorsque j'utilise une seule de ce contrôleur personnalisé dans une scène La source de commande personnalisée est ici.

@implementation RatingController 

//MARK: Properties 
const int spacing = 5; 
const int starCount = 5; 
UIButton *ratingButtons[starCount]; 

-(void)setRating:(int)rating{ 
    _rating = rating; 
    [self setNeedsLayout]; 
} 

-(int)getRating{ 
    return _rating; 
} 

//MARK: Initialization 
- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     //load the images 
     UIImage *filledStarImage = [UIImage imageNamed:@"filledStar"]; 
     UIImage *emptyStarImage = [UIImage imageNamed:@"emptyStar"]; 

     for (int i = 0; i < starCount; i++) { 
      //create button 
      UIButton *button = [[UIButton alloc]init]; 

      //set the images 
      [button setImage:emptyStarImage forState:UIControlStateNormal]; 
      [button setImage:filledStarImage forState:UIControlStateSelected]; 
      [button setImage:filledStarImage forState:UIControlStateHighlighted|UIControlStateSelected]; 

      //No additional highlight when switching state 
      button.adjustsImageWhenHighlighted = false; 

      //hook up the method which should be executed when the user touches a button 
      [button addTarget:self action:@selector(ratingButtonTapped:) forControlEvents:UIControlEventTouchDown]; 

      //add the button the the ratingButton array 
      ratingButtons[i] = button; 

      //add the button to the view 
      [self addSubview:button]; 
     } 
    } 
    return self; 
} 

-(void) layoutSubviews{ 
    //Set the button's width and height to the height of the frame. 
    const int buttonSize = self.frame.size.height;  
    CGRect buttonFrame = CGRectMake(0, 0, buttonSize, buttonSize); 

    for(int i = 0; i < starCount; i++){ 
     buttonFrame.origin.x = (i * (buttonSize + spacing)); 
     ratingButtons[i].frame = buttonFrame; 
    } 

    [self updateButtonSelectionState]; 
} 

-(CGSize) intrinsicContentSize{ 
    const int buttonSize = self.frame.size.height; 
    const int width = (buttonSize * starCount) + (spacing * (starCount -1)); 

    return CGSizeMake(width, buttonSize); 
} 

//MARK: Button Action 
-(void) updateButtonSelectionState{ 
    for(int i = 0; i < starCount; i++) 
     ratingButtons[i].selected = i < _rating; 
} 

-(void) ratingButtonTapped:(UIButton *) button{ 
    for(int i = 0; i < starCount; i++){ 
     if(ratingButtons[i] == button){ 
      _rating = i + 1; 
     } 
    } 
    [self updateButtonSelectionState]; 
} 

@end 

quand je mets 2 de ces contrôleurs personnalisés dans 1 scène je ne peux voir que celle qui est ajoutée à la fin (dans une liste seulement le dernier élément de liste montre le contrôleur personnalisé) J'espère que quelqu'un peut aider m e.

Merci beaucoup!

+0

Qu'entendez-vous par deux contrôleurs dans une scène? Les utilisez-vous dans des vues de conteneurs? –

+0

Comme ici: https://snag.gy/n0jK1h.jpg chaque élément de la liste doit contenir les étoiles –

+0

Pourriez-vous poster le code de votre source de données tableview, par exemple. cellForRowAtIndexPath. – JingJingTao

Répondre

0

Edit2:

Changé le tableau ratingButton dans une propriété et mutable tableau, ce a résolu le problème.

Edit:

Vérifiez également vos boutons sont ajoutés à votre tableau ratingButtons dans votre init et que le code « updateButtonSelectionState » dans le travail correctement.

Original:

Il vaut la peine de vérifier votre setter « rating », définissez un point de rupture et vérifiez que la valeur correcte est passé pour les deux premières cellules.

Aussi peut-être télécharger l'exemple complet, il est rapide mais au moins il vous donne quelque chose à comparer, bonne chance.

+0

Le tableau ratingButtons est rempli lorsque je place un point d'arrêt sur la valeur ratingButtons [i] .frame = buttonFrame; line j'obtiens ce résultat: https://snag.gy/pCyxKE.jpg Et le setter 'rating' fonctionne, seul le dernier élément de la table mealArray appelle la layoutSubviews(); méthode deux fois de suite, n'est-ce pas bizarre? –

+0

Je suppose que nous nous attendons à ce que layoutSubviews soit appelé trois fois. Vérifications évidentes, votre point de rupture dans votre init est déclenché trois fois, vérifiez les cadres effectivement mis en layoutSubviews. – JingJingTao

+0

Le initWithCoder s'exécute 3 fois. La première fois que layoutSubViews est appelé toutes les valeurs dans le bouton buttonFrame.frame sont 0.0 ce comportement est inattendu. Les autres valeurs d'appel sont correctes –