2017-12-29 55 views
2

두 번째 날 테이블의 문제를 해결할 수 없습니다.iOS TableView 다시로드 및 스크롤

세그먼트가 변경되면 테이블을 변경하는 segmentedControl이 있습니다. 컨트롤의 세그먼트에 3 개의 요소가 있고 이에 상응하여 3 개의 배열이 있다고 가정합니다 (중요한 것은 서로 다른 크기 임) segmentedControl이 변경되면 테이블을 위로 스크롤해야합니다.

그리고 그것은 모든처럼 보인다는 간단하다 contentOffset = .zero 및 reloadData()

하지만. 이 작동하지 않습니다, 왜 테이블 위로 스크롤하지 모르겠어요. 일

유일한 :

UIView.animate (withDuration: 0.1, animations: { 
            self.tableView.contentOffset = .zero 
        }) {(_) in 
            self.tableView.reloadData() 
} 

하지만 지금 거기 segmentedControl가 변경 되었기 때문에 테이블, 버그가 발생할 수까지가는 또 다른 문제는, 다른 배열의 데이터를하지 않을 수 있습니다 , 아직 수행하지 않았습니다. reloadData()

어쩌면 나는 명백한 것을 이해할 수 없습니다.) 다가오는 휴일에 축하합니다!

+0

여기에서 궁금하신 점이 무엇입니까? 내가 self.tableView.setContentOffset를 호출 할 때 테이블이 스크롤되지 않습니다 이유 (.zero, 애니메이션 : false)를 @RichieRich –

+0

self.tableView.reloadData는() –

+0

는 메인 스레드에있는 tableview를 다시로드 내가 노력 – karthikeyan

답변

2

UItableView 방법 테이블보기를 통해 scrollToRow(at:at:animated:) 스크롤 인덱스 패스에 의해 식별되는 행이 화면의 특정 위치가 될 때까지 귀하의 요구 사항으로 애니메이션 설정할 수 있습니다.

내 확장

extension UITableView { 

    public func reloadData(_ completion: @escaping()->()) { 
     UIView.animate(withDuration: 0, animations: { 
      self.reloadData() 
     }, completion:{ _ in 
      completion() 
     }) 
    } 

    func scroll(to: scrollsTo, animated: Bool) { 
     DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) { 
      let numberOfSections = self.numberOfSections 
      let numberOfRows = self.numberOfRows(inSection: numberOfSections-1) 
      switch to{ 
      case .top: 
       if numberOfRows > 0 { 
        let indexPath = IndexPath(row: 0, section: 0) 
        self.scrollToRow(at: indexPath, at: .top, animated: animated) 
       } 
       break 
      case .bottom: 
       if numberOfRows > 0 { 
        let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1)) 
        self.scrollToRow(at: indexPath, at: .bottom, animated: animated) 
       } 
       break 
      } 
     } 
    } 

    enum scrollsTo { 
     case top,bottom 
    } 
} 
+0

도움이 된 것 같습니다! scrollToRow를 사용하고 싶지 않은 유일한 이유 - 데이터가 없으면 인덱스 (0,0)가 없기 때문에 오류가 발생합니다. 말해줘, 그렇지? @AshvinGudaliya –

+0

scrollToRow는 테이블보기에서 적어도 하나의 행을 필요로합니다. – AshvinGudaliya

0

이것을 사용할 수 있습니다.

tableView.setContentOffset(CGPoint.zero, animated: true) 

당신이

+0

을 확인합니다. 예를 들어 reloadData()를 호출하지 않으면이 기능이 작동합니다. setContentOffset 테이블에서 reloadData를 호출 한 경우 어떤 이유로 스크롤 업되지 않습니다. –

+0

그러면 reloadData() 함수를 먼저 호출 할 수 있습니다. 이 방법으로 테이블 뷰 스크롤뿐만 아니라 데이터도로드됩니다. –

0

나는이 작업을 수행하는 더 좋은 방법을 발견 할 수 있습니다. 그것은 매력처럼 작동합니다.

let topIndex = IndexPath(row: 0, section: 0) 
tableView.scrollToRow(at: topIndex, at: .top, animated: true)