2014-06-05 8 views
9

Ich habe dieses seltsame Problem mit UITableView und UITableViewCell. Immer wenn die -tableView:cellForRowAtIndexPath: aufgerufen wird, wird die setSelected: NO wird anschließend aufgerufen.Was ruft die setSelected: NO-Methode automatisch

-(UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSDictionary *cellData = dataSource[indexPath.row]; 

    NSString *cellId = nil; 
    //choose cell type 
    NSInteger type = [[cellData valueForKey:@"type"] integerValue]; 
    switch (type) { 
     case 0: 
      //root level 
      cellId = @"rootHeaderCell"; 
      break; 
     case 1: 
      //sub header 
      cellId = @"subHeaderCell"; 
      break; 
     case 2: 
     default: 
      //value row - radiobutton 
      cellId = @"radiobuttonCell"; 
      break; 
    } 

    CSBaseFilterCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId 
                  forIndexPath:indexPath]; 

    // Configure the cell... 
    [cell setData:cellData]; 

    return cell; 
} 

cellData enthält Informationen über die Auswahl und in Zelle:

-(void)setData:(NSDictionary *)data { 

NSLog(@"Set Data"); 
NSLog(@"data has selected=%d", [data hasKey:@"selected"]); 
NSLog(@"data.selected=%@", [data valueForKey:@"selected"]); 

    if ([data hasKey:@"selected"]) { 
     [self setSelected:[[data valueForKey:@"selected"] boolValue] 
       animated:NO]; 

    } 
} 

ich die Auswahl, aber es wurde nicht ausgewählt. Ich habe setzen Spuren in setData und die Werte waren in Ordnung, ich habe Spur setzen in setSelected:animated: und festgestellt, dass drei Anrufe sind:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    NSLog(@"%@ setSelected:selected=%d",self,selected); 


    self.accessoryType = selected ? UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone; 
} 

das ist, was auf Protokollausgabe angezeigt:

2014-06-05 21:11:59.679 UITableView Filter Sort[42821:60b] Set Data 
2014-06-05 21:11:59.679 UITableView Filter Sort[42821:60b] data has selected=1 
2014-06-05 21:11:59.680 UITableView Filter Sort[42821:60b] data.selected=1 
2014-06-05 21:11:59.680 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=1 
2014-06-05 21:11:59.686 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=0 
2014-06-05 21:11:59.811 UITableView Filter Sort[42821:60b] <CSRadioButtonCell: 0x8c80630; baseClass = UITableViewCell; frame = (0 64; 320 32); autoresize = W; layer = <CALayer: 0x8c76920>> setSelected:selected=0 

Tabelle ist in der ViewController platziert, es ist nicht UITableViewController.

UPDATE Ich habe die setData setzen: Anruf in willDisplayCell:forRowAtIndexPath: und entfernt Aufruf von super Definition von setSelected und dies das Problem behoben. Es zeigt immer noch in Protokollen, die setSelected ohne Argument zwischen setData in cellForRowAtIndexPath genannt wird und willDisplayCell:forRowAtIndexPath: aber zumindest willDisplay ist zuletzt :)

Ich habe auch erfolgreich mit meiner eigenen „Auswahl“ Eigenschaft versuchte checked, die in setData: gesetzt ist und in didSelectRowAtIndexPath:.

+0

Sie könnten Sie einen Haltepunkt setzen gerade dort und finden Sie heraus. Unabhängig davon ist die Verwendung des visuellen Zustands der Zelle, um Ihre Modellinformationen zu behalten, eine SCHLECHTE Idee. –

+1

wie Sie aus SetData Auswahl IS im Modell sehen können, was geschieht, ist, dass Informationen vom Modell durch zusätzliche Aufrufe von setSelected überschrieben werden: und ich möchte herausfinden, was diese Aufrufe –

+0

Vielen Dank für das Debugging Feedback, sehr hilfreich.Das Extra Aufrufe von setSelected mit NO beziehen sich auf die Wiederverwendung von Zellen (UITableView: prepareForReuse) und die Zellenvorbereitung für die Anzeige (UITableView: _configureCellForDisplay). –

Antwort

6

die setSelected in - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

+3

Es verhält sich auf die gleiche Weise, wenn ich scrolle, kann ich kurz das Häkchen sehen, aber wenn Animation stoppt Häkchen ist weg. Wenn ich den Aufruf von [super setSelected: selected animated: animated] entfernt habe; Dann fing es an zu arbeiten. Dies zeigt jedoch nicht, warum setSelected viele Male mit 'NO'-Argument aufgerufen wird. –

Verwandte Themen