토글로 사용되는 세그먼트 화 된 컨트롤이 있습니다. 전환 할 때 테이블 뷰에서 많은 내용을 전환합니다 (테이블 뷰에서 섹션 삽입/삭제, 변경 사항 애니 메이팅 등). 분할 된 컨트롤이 선택 항목에 즉시 응답하기를 원합니다. 분할 컨트롤의 UIControlEventValueChanged 이벤트 처리 코드 내 행동 그래서, 나는 다음을 수행하십시오UISegmentedControl (다른 것들 중에서도) 응답 가능 유지
- (IBAction)groupingChanged:(id)sender {
UISegmentedControl *seg = sender;
[tableModel toggleOn:[seg selectedSegmentIndex] == ToggleOnIndex];
[self performSelectorOnMainThread:@selector(updateGrouping)
withObject:nil
waitUntilDone:NO];
}
을 updateGrouping
은 여기서
waitUntilDone:NO
설정
- (void)updateGrouping {
MXAssertMainThread();
[tableView beginUpdates];
... several table updates
[tableView endUpdates];
}
가 updateGrouping
가 호출되기 전에 groupingChanged
방법을 완료 할 수 있습니다, 그러나 이것은보기를 다시 그리기에 충분하지 않은 것 같습니다. 세분화 된 컨트롤은 테이블 업데이트가 완료 될 때까지 계속 스틱되어 전환됩니다.
groupingChanged:
수정 시도 :
- (void)delayed {
[self performSelectorOnMainThread:@selector(updateGrouping)
withObject:nil
waitUntilDone:NO];
}
- (IBAction)groupingChanged:(id)sender {
UISegmentedControl *seg = sender;
[tableModel toggleOn:[seg selectedSegmentIndex] == ToggleOnIndex];
[self performSelectorInBackground:@selector(delayed) withObject:nil];
}
을 그리고이 작업을 수행합니다. 세분화 된 컨트롤이 즉시 전환되고 테이블이 곧 따라옵니다. 그러나 결과에 대한 확신이 전혀 없습니다. 새 스레드가 시작되는 동안 주 스레드에게 유예 기간을 부여하는 부작용입니까? UI 업데이트를 큐에 저장하는 방법일까요? 분명히 해커 야. 나는 누군가가이 상황에 대해 그들이 따르고있는 더 좋은 패턴을 가지고 있기를 바라고있다.
중간 스레드를 제거하므로 개선되었지만 일반적으로 해킹되지 않는 패턴이 없다고 생각하지 않습니다. –
performSelector : withObject : afterDelay는 Kendall이 지적한대로 유효합니다. 이 문제는 UI를 업데이트 할 수 있도록 실행 루프를 완료해야한다는 것입니다. 실제로 해킹이 아니라이 사실을 인정하는 것입니다. 어쨌든 주 스레드가 그 과정을 실행하는 것을 허용하지 않으면 서 UI를 업데이트하는 방법을 알지 못합니다. –
물론, 나는 그 원인을 깨닫습니다. 나는 이것에 대한 공통적 인 패턴을 기대하고 있었다고 생각한다. 크레딧은 (뒤늦게) 수여됩니다. –