web-dev-qa-db-ja.com

UITableViewの下部に来てからさらにロード

私のアプリでは、以下のように「一番下にもっと読み込む」プロパティを使用しています。実際には問題なく動作します。唯一の問題は、ユーザーが最下部に到達したときに、追加の読み込み機能が機能しているときに、UIRefreshcontrolのようなアニメーションビューがないため、アプリがしばらくフリーズしているように見えることです。新しいデータが読み込まれるまでアニメーションを表示するにはどうすればよいですか。いくつかのUIBottomrefreshcontrolプロパティを個別のライブラリとして見つけましたが、それらはすべてObjective-cにありました。

override func viewDidLoad() {
    super.viewDidLoad()

   refreshResults()

 }

 func refreshResults() {


    refreshPage = 40

    // here the query starts
}


func refreshResults2() {

     // here the query starts to add new 40 rows of data to arrays

}


func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,     forRowAtIndexPath indexPath: NSIndexPath) {

    if indexPath.row == refreshPage-1 {
        refreshPage = refreshPage + 40

        refreshResults2()

    }
}
7
saner

UITableViewControllerにUIActivityIndicatorView(つまりスピナー)を追加します。コンセントをコードに接続します。

_@IBOutlet weak var spinner: UIActivityIndicatorView!
_

UITableViewControllerにプロパティを追加して、現在より多くのデータをロードしていることを追跡し、2回実行しようとしないようにします。

_var loadingData = false
_

スピナーのアニメーションを開始してから、refreshResults2()を呼び出します。

_func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if !loadingData && indexPath.row == refreshPage - 1 {
        spinner.startAnimating()
        loadingData = true
        refreshResults2()
    }
}
_

refreshResults2()をバックグラウンドスレッドで実行します。これにより、テーブルを自由に動かすことができます。アニメーション化されたスピナーは、より多くのデータが来ることをユーザーに知らせます。クエリが返されたら、メインスレッドのテーブルデータを更新します。

_func refreshResults2() {
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
        // this runs on the background queue
        // here the query starts to add new 40 rows of data to arrays

        dispatch_async(dispatch_get_main_queue()) {
            // this runs on the main queue
            self.refreshPage += 40
            self.tableView.reloadData()
            self.spinner.stopAnimating()
            self.loadingData = false
        }
    }
}
_
24
vacawama
  • Swift 3、Xcode 8
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let lastElement = dataSource.count - 1
    if !loadingData && indexPath.row == lastElement {
        spinner.startAnimating()
        loadingData = true
        loadMoreData()
    }
}

@vacawama async call in Swift 3:-

func loadMoreData() {
    DispatchQueue.global(qos: .background).async {
        // this runs on the background queue
        // here the query starts to add new 10 rows of data to arrays
        DispatchQueue.main.async {
             // this runs on the main queue
                self.spinner.stopAnimating()
                self.loadingData = false

        }
    }
}
2
Abdul Karim