下拉模块实现的具体代码:
override func viewDidLoad() {
self.view.addSubview(self.tableView)
self.tableView.snp.makeConstraints { (make) in
make.edges.equalTo(self.view)
}
self.tableView.mj_header = V2RefreshHeader.init(refreshingBlock: {
//下拉事假触发后,会执行这里
self.refresh()
})
//代码触发下拉事件(也可以通过手势下拉)
self.tableView.mj_header.beginRefreshing()
}
注意,V2RefreshHeader是自定义的Header对象,也可以是用系统默认的MJRefreshNormalHeader
header回调闭包里的代码:
func refresh() {
//传入参数都是函数默认参数
TopicListModel.getTopicList { (response) in
//1.获取数据,更新tableView
self.topicList = response.value
self.tableView.reloadData()
/**
2.判断标签是否能加载下一页,不能就提示
说明:为什么这段代码放在header的回调里。因为每当我们手动下拉,或者代码调用下拉后,会执行header回调,那么每次都要判断节点是不是翻页的功能
*/
let refreshFooter = self.tableView.mj_footer as! V2RefreshFooter
if self.tab == nil || self.tab == "all" {
refreshFooter.noMoreDataStateString = nil
refreshFooter.resetNoMoreData()
}
else{
refreshFooter.noMoreDataStateString = "没有更多帖子了,只有【All】标签能翻页"
refreshFooter.endRefreshingWithNoMoreData()
}
//3.重置page
self.currentPage = 0
self.tableView.mj_header.endRefreshing()
}
}
上拉添加更多模块代码:
self.view.addSubview(self.tableView)
self.tableView.snp.makeConstraints { (make) in
make.edges.equalTo(self.view)
}
let footer = V2RefreshFooter(refreshingBlock: {
self.getNextPage()
})
footer?.centerOffset = -4
self.tableView.mj_footer = footer
这里的V2RefreshFooter也是自定义的footer。
footer闭包代码:
func getNextPage() {
//1.点击某个节点后,下拉刷新结果是每有数据,那么上拉是没有意义的。
if let count = self.topicList?.count, count <= 0 {
self.tableView.mj_footer.endRefreshing()
return;
}
//2.一般默认下拉获取数据时,传入的currentPage是0,那么获取第二页内容,传入的currentPage是1.
self.currentPage += 1
TopicListModel.getTopicList(tab: tab, page: self.currentPage) { (response:V2ValueResponse<[TopicListModel]>) in
if response.success {
//3.获取的数据如果是空,表示全部获取,代码不会进入if
if let count = response.value?.count, count > 0 {
//4.注意这里用的是数组的拼接,这样可以实现主页的下拉样式,而不是翻页样式
self.topicList! += response.value!
self.tableView.reloadData()
}
}
else{
//5.获取失败。
self.currentPage -= 1
}
}
//6.停止刷新
self.tableView.mj_footer.endRefreshing()
}