Swift tableView 分页 [英] Swift tableView Pagination
问题描述
我使用 json 解析代码成功处理了 tableview.但可能还有 1000 个以上的项目,因此在滚动底部时需要分页.我不知道如何在下面的代码中执行此操作.对于objective-c 有很多示例,但对于swift 我没有找到工作示例.我在等你的帮助.我认为会帮助太多人.谢谢 !
I have success working tableview with json parsing codes.But may have 1000 more item so need pagination when scrolling bottom side. I dont know how can i do this my codes under below. For objective-c have a lot of example but for swift i didnt find working example. Im waiting your helps. I think will be help too many people. Thank you !
import UIKit
class ViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {
let kSuccessTitle = "Congratulations"
let kErrorTitle = "Connection error"
let kNoticeTitle = "Notice"
let kWarningTitle = "Warning"
let kInfoTitle = "Info"
let kSubtitle = "You've just displayed this awesome Pop Up View"
@IBOutlet weak var myTableView: UITableView!
@IBOutlet weak var myActivityIndicator: UIActivityIndicatorView!
var privateList = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
loadItems()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
internal func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return privateList.count
}
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell:myCell = tableView.dequeueReusableCellWithIdentifier("myCell") as! myCell
cell.titleLabel.text = privateList[indexPath.row]
return cell
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
print(indexPath.row)
let alert = SCLAlertView()
alert.addButton("Hayır"){ }
alert.addButton("Evet") {
self.myTableView.beginUpdates()
self.privateList.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Left)
print("Silindi")
self.myTableView.endUpdates()
self.loadItems()
}
alert.showSuccess(kSuccessTitle, subTitle: kSubtitle)
}
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// the cells you would like the actions to appear needs to be editable
return true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "Detail") {
let destinationView = segue.destinationViewController as! DetailViewController
if let indexPath = myTableView.indexPathForCell(sender as! UITableViewCell) {
destinationView.privateLista = privateList[indexPath.row]
}
}
}
internal func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat
{
return 0.0
}
func loadItems()
{
loadItemsNow("privateList")
}
func loadItemsNow(listType:String){
myActivityIndicator.startAnimating()
let listUrlString = "http://bla.com/json2.php?listType=" + listType + "&t=" + NSUUID().UUIDString
let myUrl = NSURL(string: listUrlString);
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "GET";
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print(error!.localizedDescription)
dispatch_async(dispatch_get_main_queue(),{
self.myActivityIndicator.stopAnimating()
})
return
}
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSArray
if let parseJSON = json {
self.privateList = parseJSON as! [String]
}
} catch {
print(error)
}
dispatch_async(dispatch_get_main_queue(),{
self.myActivityIndicator.stopAnimating()
self.myTableView.reloadData()
})
}
task.resume()
}
}
推荐答案
为此,您还需要更改服务器端.
For that you need to have server side change also.
服务器将接受
API
url 中的fromIndex
和batchSize
作为查询参数.
Server will accept
fromIndex
andbatchSize
in theAPI
url as query param.
let listUrlString = "http://bla.com/json2.php?listType=" + listType + "&t=" + NSUUID().UUIDString + "&batchSize=" + batchSize + "&fromIndex=" + fromIndex
在服务器响应中,会有一个额外的键totalItems
.这将用于识别是否收到所有项目.fromIndex
到 batchSize
个项目数的数组或项目.
In the server response, there will be an extra key totalItems
. This will be used to identify all items are received or not. An array or items fromIndex
to batchSize
number of items.
在应用端
第一个
loadItem()
将使用fromIndex = 0
和batchSize = 20
调用(例如在viewDidLoad()
或viewWillAppear
).在第一次调用loadItem()
之前从privateList
数组中删除所有项目
First
loadItem()
will be called withfromIndex = 0
andbatchSize = 20
(for example inviewDidLoad()
orviewWillAppear
). removeAll items fromprivateList
array before callingloadItem()
for the first time
服务器返回一个包含前 20 个项目和服务器中项目总数 totalItems
的数组.
Server returns an array of first 20 items and totalItems
total number of items in the server.
追加privateList
数组中的20个条目并重新加载tableView
Append the 20 items in privateList
array and reload tableView
在 tableView:cellForRowAtIndexPath
方法中检查单元格是否是最后一个单元格.并检查 totalItems
(表单服务器)是否大于 privateList.count
.这意味着服务器中有更多项目要加载
In tableView:cellForRowAtIndexPath
method check if the cell is the last cell. And check if totalItems
(form server) is greater than privateList.count
. That means there are more items in the server to load
if indexPath.row == privateList.count - 1 { // last cell
if totalItems > privateList.count { // more items to fetch
loadItem() // increment `fromIndex` by 20 before server call
}
}
<小时>
问题: 刷新在哪里?会滚动吗?
在收到服务器响应时在数组中添加新项目后刷新.(第 3 步)
Refresh after appending new items in the array when server response received. (step 3)
滚动将在用户滚动时为每个单元格触发 tableView:cellForRowAtIndexPath
.代码正在检查它是否是最后一个单元格并获取剩余的项目.(第 4 步)
Scrolling will trigger tableView:cellForRowAtIndexPath
for every cell when user scrolls. Code is checking if it is the last cell and fetch remaining items. (step 4)
添加的示例项目:
https://github.com/rishi420/TableViewPaging
这篇关于Swift tableView 分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!