2014-06-05 2 views
9

UITableView 및 UITableViewCell에 이상한 문제가 있습니다. -tableView:cellForRowAtIndexPath:이 호출 될 때마다 setSelected : NO가 나중에 호출됩니다.무엇이 자동으로 setSelected : NO 메소드를 호출합니까?

-(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는 선택에 대한 세포에 정보가 포함

-(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]; 

    } 
} 

나는 선택을 설정하지만,이 선택되지 않았습니다. 나는 사항 setData에 흔적을 넣어했고 값이 잘했다, 나는 setSelected:animated:에서 추적을 넣어 가지고 3 호출이 만들어진 것을 발견 :

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 

:

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


    self.accessoryType = selected ? UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone; 
} 

이 로그 출력에 표시되는 내용입니다 테이블은 ViewController에 있으며 UITableViewController가 아닙니다. willDisplayCell:forRowAtIndexPath:에 전화 제거 전화를하는 setSelected의 슈퍼 정의에이 문제를 해결 :

UPDATE 가 나는 사항 setData를 뒀다. 아직하는 setSelected는 cellForRowAtIndexPathwillDisplayCell:forRowAtIndexPath:의 사항 setData 사이를 지정해 불려가 로그에 표시하지만 적어도 willDisplay 나는 또한 setData:과에 설정되어 내 자신의 "선택"속성 checked 성공적으로 시도 마지막 :

입니다 didSelectRowAtIndexPath:.

+0

거기에 중단 점을 설정하면 알 수 있습니다. 그럼에도 불구하고 모델 정보를 유지하기 위해 셀의 시각적 상태를 사용하는 것은 나쁜 생각입니다. –

+1

모델에서 setData 선택 IS에서 볼 수 있듯이 모델의 정보가 setSelected에 대한 추가 호출로 재정의됩니다. 해당 호출을 수행하고있는 것을 찾고 싶습니다. –

+0

디버깅 피드백을 보내 주셔서 감사합니다. NO로 setSelected를 호출하면 셀 재사용 (UITableView : prepareForReuse) 및 표시를위한 셀 준비 (UITableView : _configureCellForDisplay)와 관련됩니다. –

답변

6

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

+3

같은 방식으로 동작합니다. 스크롤 할 때 틱을 잠시 볼 수 있지만 애니메이션이 멈 추면 틱이 사라집니다. [super setSelected : selected animated : animated]에 대한 호출을 제거한 경우 그 때 그것은 작동하는 것을 시작했다. 그러나 이것은 setSelected가'NO' 인수로 여러 번 호출되는 이유를 가리 킵니다. –

관련 문제