我有成功的工作与JSON解析代码的表视图.但可能有1000多个项目,所以需要分页时滚动底部.我不知道如何才能做到这一点,我的代码如下.对于Objective-c,我有很多例子,但是对于迅捷来说,我没有找到工作的例子.我在等你的帮助.我认为这会帮助太多的人.谢谢你!

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


}

推荐答案

为此,还需要对服务器端进行更改.

  1. 服务器将接受API url中的fromIndexbatchSize作为查询参数.

    let listUrlString =  "http://bla.com/json2.php?listType=" + listType + "&t=" + NSUUID().UUIDString + "&batchSize=" + batchSize + "&fromIndex=" + fromIndex
    
  2. 在服务器响应中,将有一个额外的密钥totalItems.这将用于标识是否收到所有项目.一个数组或多个项fromIndexbatchSize.

在应用程序端

  1. loadItem()将与fromIndex = 0batchSize = 20一起调用(例如,在viewDidLoad()viewWillAppear中).在第一次调用loadItem()之前从privateList数组中移除所有项

  2. 服务器返回一个包含前20个项目和服务器中totalItems个项目总数的array.

  3. 将20项追加到privateList数组中,然后重新加载tableView

  4. tableView:cellForRowAtIndexPath方法中,判断该单元格是否为最后一个单元格.并判断totalItems(表单服务器)是否大于privateList.count.这意味着服务器中有更多项目要加载

    if indexPath.row == privateList.count - 1 { // last cell
        if totalItems > privateList.count { // more items to fetch
            loadItem() // increment `fromIndex` by 20 before server call
        }
    }
    

Question: where is refresh ? will be scrolling ?

收到服务器响应时,在数组中追加新项目后刷新.(步骤3)

当用户滚动时,滚动将 for each 单元格触发tableView:cellForRowAtIndexPath.代码正在判断它是否是最后一个单元格,并获取剩余的项.(步骤4)

添加的示例项目:
https://github.com/rishi420/TableViewPaging

Ios相关问答推荐

实例方法wait在异步上下文中不可用;请改用TaskGroup;这是Swift 6中的错误''

SWIFT图表轴订购问题

如何在Flutter 中为S家长增加一个相对高度的间距

从后台线程调用DispatchObject的方法安全吗?

带有故事板的Xcode 15 UIKit视图可以与#Preview宏一起使用吗?

在flutter中使用flatter_screenutil这样的软件包的目的是什么?

ionic 4 - 编译 ios - 来自项目Pods的目标GoogleDataTransport中的问题

SwiftUI 中的描边图像边框

我正在try 制作一种 Select 器样式,例如设置中的外观 Select 器

弹出视图后使所有背景 UI 模糊

从远程通知启动时,iOS 应用程序加载错误

try 在 iOS 中分发 Flutter 应用程序时出现Invalid Provisioning Profile Signature错误

访问未定义的 stage_in 金属着色器参数

警告:iPad:Icon-72.png:图标尺寸(0 x 0)

如何在 Swift 中使用包含多个值的查询参数构建一个 URL?

Xcode 11 向后兼容性:UIWindowScene 仅在 iOS 13 或更高版本中可用

iOS7 UITextView contentsize.height 替代

从 UIScrollview 中删除内容和框架布局指南

在自动布局中居中子视图的 X 会引发未准备好约束

将 struct 保存到 UserDefaults