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는 cellForRowAtIndexPath
및 willDisplayCell:forRowAtIndexPath:
의 사항 setData 사이를 지정해 불려가 로그에 표시하지만 적어도 willDisplay 나는 또한 setData:
과에 설정되어 내 자신의 "선택"속성 checked
성공적으로 시도 마지막 :
입니다 didSelectRowAtIndexPath:
.
거기에 중단 점을 설정하면 알 수 있습니다. 그럼에도 불구하고 모델 정보를 유지하기 위해 셀의 시각적 상태를 사용하는 것은 나쁜 생각입니다. –
모델에서 setData 선택 IS에서 볼 수 있듯이 모델의 정보가 setSelected에 대한 추가 호출로 재정의됩니다. 해당 호출을 수행하고있는 것을 찾고 싶습니다. –
디버깅 피드백을 보내 주셔서 감사합니다. NO로 setSelected를 호출하면 셀 재사용 (UITableView : prepareForReuse) 및 표시를위한 셀 준비 (UITableView : _configureCellForDisplay)와 관련됩니다. –