分页Tableview Swift

时间:2018-03-13 12:34:51

标签: ios swift uitableview swift3 pagination

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

我的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()
            }
        }
    }
}
}

2 个答案:

答案 0 :(得分: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 中,我从服务器加载项目,然后保存当前页面。

我希望能帮助你解决上面的问题!

答案 1 :(得分:0)

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

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

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

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

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