2016-07-21 21 views
0

ich eine App zu entwickeln (durch ein Tutorial, aber das Tutorial ist für Swift geschrieben und ich lerne Objective-C. Tutorial sourceiOS Benutzerdefinierte Ansichten zeigen nach oben nicht

Aber ich habe ein Problem, ich bin eine benutzerdefinierte Controller (RatingController) zu entwickeln, das funktioniert, wenn ich nur in einer Szene eine dieser benutzerdefinierten Controller verwenden Die Custom-Controller Quelle ist hier:.

@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 

wenn ich 2 in 1 dieser benutzerdefinierten Controller setzen Szene kann ich nur die sehen, die am Ende hinzugefügt wird (in einer Liste nur das letzte Listenelement zeigt den benutzerdefinierten Controller) Ich hoffe jemand kann helfen m e.

Vielen Dank schon!

+0

Was meinen Sie mit zwei Controllern in einer Szene? Verwenden Sie sie in Containeransichten? –

+0

Wie hier: https://snag.gy/n0jK1h.jpg jedes Listenelement sollte die Sterne enthalten –

+0

Konnten Sie den Code für Ihre tableview Datenquelle, z. cellForRowAtIndexPath. – JingJingTao

Antwort

0

Edit2:

das Array ratingButton Changed in eine Eigenschaft und änderbaren Array beschlossen, das das Problem.

Edit:

Überprüfen Sie auch Ihre Tasten, um Ihre ratingButtons Array in Ihrer init hinzugefügt werden und dass der Code in 'updateButtonSelectionState' richtig in Arbeit.

Original:

Es lohnt ‚Bewertung‘ Setter Überprüfung, stellen Sie einen Haltepunkt und überprüfen, ob der richtige Wert für die ersten beiden Zellen geleitet wird.

Vielleicht auch das komplette Beispiel herunterladen, es ist in swift, aber es gibt Ihnen zumindest etwas Vergleichbares, viel Glück.

+0

Das ratingButtons-Array ist gefüllt, wenn ich einen Haltepunkt bei den ratingButtons [i] .frame = buttonFrame; line Ich bekomme dieses Ergebnis: https://snag.gy/pCyxKE.jpg Und der 'rating' Setter funktioniert, nur der letzte Eintrag in der measuresArray ruft den layoutSubviews() auf; Methode zweimal hintereinander, ist das nicht komisch? –

+0

Ich denke, wir erwarten, dass layoutSubviews dreimal aufgerufen wird. Offensichtliche Prüfungen, Ihr Haltepunkt in Ihrer Init wird dreimal ausgelöst, prüfen Sie, ob die tatsächlichen Frames in layoutSubviews gesetzt sind. – JingJingTao

+0

Der initWithCoder wird 3 mal ausgeführt. Das erste Mal layoutSubViews heißt alle Werte in der buttonFrame.frame sind 0.0 das ist unerwartetes Verhalten. Die anderen Rufwerte sind korrekt –