2017-12-29 50 views
2

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

あなたの質問はここで何を達成したいですか?メインスレッドであなたのテーブルビューをリロードし、私が試した –

+0

@RichieRichなぜテーブルには、上にスクロールしません。 これは、reloadData()を呼び出さないと機能します 何らかの理由でsetContentOffsetテーブルの後にreloadDataを呼び出すと、スクロールアップされません。 –

+0

self.tableView.reloadData():私は self.tableView.setContentOffset(偽.zero、アニメーション)を呼び出すとき – 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テーブルビューで少なくとも1つの行が必要です – AshvinGudaliya

0

これを使用できます。

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

もし

+0

をチェック –

+0

これより前にreloadData()関数を呼び出すことができます。このようにして、データが読み込まれ、テーブルビューのスクロールが上に移動します。 –

0

を使用することができます。それは魅力のように働く。

関連する問題