【问题标题】:Pagination Tableview Swift分页 Tableview Swift
【发布时间】:2018-08-21 17:18:20
【问题描述】:

我是 ios 开发新手。我想使用分页在tableview中加载大量数据。加载新页面时,我将数据附加到“myMainList”并重新加载tableview,但这似乎不是加载更多数据的好方法。我找不到快速的一个很好的解决方案。

我的 json 响应中有一个分页对象。

{
"pagination" : {
"total" : 13,
"last_page" : 2,
"per_page" : 10,
"next_page_url" : null,
"current_page" : 2,
"prev_page_url" : "http:\/\/xxxxxxxxxxxx/page=1"
}
}

这是我的代码。希望您能理解我的问题。正在寻找一个好的解决方案。在此先感谢。

var pagenationURL = ""
var myMainList : [MyModel] = []
var rowCount : Int = 0

override func viewDidLoad() {
    super.viewDidLoad()
    let parameters = ["token":NetworkingUtil.getUserToken()]
    callWebService(parameters: parameters)
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let lastItem = rowCount-1
    if(indexPath.row) == lastItem {
        loadMoreData()
    }
}


func loadMoreData(){
    let parameters = ["token":NetworkingUtil.getUserToken()]

    if(pagenationURL.isEmpty){
        print("end of page")
    }
    else{
        callWebService1(parameters: parameters)
    }
}

func callWebService(parameters : [String : String]) {
Alamofire.request(Common.getMyExpense(), method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: NetworkingUtil.getAlamoFireHeader()).responseJSON { (Response) in
    let error = Response.result.error
    let req = Response.request
    let res = Response.response
    let json = Response.data
    if error != nil {
        if req != nil && res != nil {
            print(req!)
            print(res!)
        }
    }else{
        var parsedjson : JSON!;
        do {
            parsedjson = try JSON(data : json!)
            print(parsedjson)
        } catch {
            print(error)
        }

     else{
            let myExpensejson = parsedjson["results"]
            self.pagenationURL = parsedjson["pagination"]["next_page_url"].stringValue
            let lostkeyrequestscount : Int = myExpensejson.count
            self.rowCount = lostkeyrequestscount
            self.myMainList = []

            for(_,keylist): (String,JSON) in myExpensejson
            {
                let status = lostkeylist["status"].stringValue
                let date = lostkeylist["date"].stringValue
                let keyObject = MyExpenseModel(status: status, date: date)
                self.myMainList.append(keyObject)
                self.tableview.reloadData()
            }
        }
    }
}
}

func callWebService1(parameters : [String : String]) {
  Alamofire.request(pagenationURL, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: NetworkingUtil.getAlamoFireHeader()).responseJSON { (Response) in
    let error = Response.result.error
    let req = Response.request
    let res = Response.response
    let json = Response.data
    SVProgressHUD.dismiss()
    if error != nil {
        if req != nil && res != nil {
            print(req!)
            print(res!)
        }
    }else{
        var parsedjson : JSON!;
        do {
            parsedjson = try JSON(data : json!)
            print(parsedjson)
        } catch {
            print(error)
        }
      else{
            let myExpensejson = parsedjson["results"]
            self.pagenationURL = parsedjson["pagination"]["next_page_url"].stringValue


            let lostkeyrequestscount : Int = myExpensejson.count
            self.rowCount = lostkeyrequestscount+self.rowCount

            for(_,keylist): (String,JSON) in myExpensejson
            {
                let status = lostkeylist["status"].stringValue
                let date = lostkeylist["date"].stringValue
                let keyObject = MyExpenseModel(status: status, date: date)
                self.myMainList.append(keyObject)
                self.tableview.reloadData()
            }
        }
    }
}
}

【问题讨论】:

    标签: ios swift uitableview swift3 pagination


    【解决方案1】:

    我用Objective-C编写的一个包用于分页或无限滚动。对我帮助很大。

    包裹:UIScrollView+InfiniteScroll

    使用方法:

    // add inifinite scroll
    self.tableView.addInfiniteScroll { [unowned self] (tableView) in
      self.loadMore()
    }
    //  Preload more data 800pt before reaching the bottom of scroll view.
    self.tableView.infiniteScrollTriggerOffset = 800
    

    在loadMore函数中,我从服务器加载项目并保存当前页面。

    希望对我上面的回答有所帮助!

    【讨论】:

      【解决方案2】:

      这不仅仅是你的问题,服务器端必须首先改进。 我通过在参数中给出偏移量来解决这个问题。

      var offset = 0
      let params: Parameters = [... , "offset": offset]
      

      每次加载更多,偏移量增加 10 //for your case, it is 10

      加载前 10 个,然后加载第二个 10,依此类推。

      与服务器端开发人员讨论,他们知道。

      【讨论】:

      • 谢谢 BatyrCan
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2017-06-29
      相关资源
      最近更新 更多