2017-11-29 21 views
0

내 애플 리케이션의 여러 위치에서 루프에서 tableView.reloadData() 호출을 사용하고 있습니다. 기본적인 생각은 다음과 같습니다 :tableView reloadData가 각 패스마다 셀을 그리지 않습니다.

let dataSourceArray = [] 
for arrayItem in anotherArray { 
    dataSourceArray.append(arrayItem) 
    self.tableView.reloadData() 
} 

내가 달성하려는 것은 모델 배열에로드 된대로 각 셀을 tableView로 그려야합니다.

현재 루프가 완료되면 모든 셀이 표시됩니다.

이것은 모두 메인 스레드에서 수행되지만 reloadData 호출의 메인 스레드로 디스패치하려고 시도했습니다. 그것은 아무런 효과가 없었다. 나는 reloadData 후에 tableView.layoutIfNeeded()를 시도했으나 아무런 차이가 없었다.

cellForRowAtIndexPath 및 heightForRow ... 메서드에 중단 점을 배치하면 루프의 각 패스에서 예상대로 일반 tableView 호출을 나타냅니다. 그러나 어떤 이유로 셀은 루프가 완료 될 때까지 화면에 그려지지 않습니다.

어쨌든 내가 시도한 것 이외의 각 단계에서 셀을 그리려면 tableView를 강제로 적용 할 수 있습니까?

+1

왜 'reloadData'를 호출할까요? 'insertRows (at')를 사용하여 단일 행에 대한 전체 테이블보기를 다시로드하지 않고 각 행을 삽입하십시오. – rmaddy

답변

0

이유는 이유는 요소의 루핑이 매우 빠르게 (밀리 초) 완료 될 것이므로 점진적 변경 사항을 알 수 없기 때문입니다.

+1

아니요, 현재 runloop이 완료 될 때까지 UI가 업데이트되지 않고 그럴 때까지 UI가 업데이트되지 않기 때문입니다 이 루프가 끝나면 얼마나 빨리 일어나는지와 아무 관련이 없습니다. – rmaddy

0

아래와 같이 전역 대기열에서 외부 루프를 실행하고 reloadData를 기본 대기열로 보내야합니다.

var dataSourceArray = [ String ]() 

@IBAction func 
DoA(_: Any?) { 

    let anotherArray = [ "A", "B", "C" ] 

    DispatchQueue.global().async { 
     for arrayItem in anotherArray { 
      self.dataSourceArray.append(arrayItem) 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
      Thread.sleep(forTimeInterval: 1) 
     } 
    } 
} 
0

깔끔한 애니메이션이 보이기를 원한다면, 각 추가 사이에 타이머를 설정할 수 있습니다. UIView.animate 또는 UIView.transition을 사용하면 ... 전환 방법이 더 좋을 것입니다. 변경 사항을 더욱 단순하게 만드는 몇 가지 옵션이 있습니다. 여기

당신이 할 수있는 일의 샘플입니다보다

var i = 0 

func addItem(){ 
    if i == anotherArray.count { 
     return 
    } 
    UIView.transition(with: tableView, duration: 0.3, options: [.allowAnimatedContent, .transitionCrossDissolve], animations: { // content that is going to animate 
     dataSourceArray.append(anotherArray[i]) 
     tableView.reloadData() 
    }) { // completion block 
     i += 1 
     addItem() 
    } 
} 

기타 (직접 붙여 복사 해달라고 자신에 조정, 내가 그것을 테스트하지 않고 놀이터에서 쓴), 당신은 변경할 수 있습니다 (대부분 스토리 보드의) tableView의 콘텐츠 모드는 .top으로 설정되므로 tableView가 점프하는 것보다 항상 위로 올라가는 모든 변경시 (https://developer.apple.com/documentation/uikit/uiview/1622619-contentmode). 이것은 자동 레이아웃을 사용하는 경우 특별히 도움이됩니다.