2

我有一个表格视图,有时我会得到 1000 或 40 甚至有时甚至 4 个值,但我希望当我得到超过 100 个值时,我想以 10 - 10 的滚动显示我的数组。

向上滚动表格视图,我需要在向上滚动 10 行后暂停滚动,使用此代码会出错,我的数组在 [Any] 中,并且想要像 Facebook 和 instagram 一样滚动

我想先把我的数组分成 10 行,然后我可以追加下 10 行。

    var allUserArray = [Any]()
    override func viewDidLoad() {
        super.viewDidLoad()

    var index = allUserArray.first 
    while index < limit {
    allUserArray.append(index)
    index = index + "1"
  }

  }

  extension AdvanceSearchViewController: UITableViewDataSource,           UITableViewDelegate {

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return allUserArray.count 

}

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "advanceSearch") as! AdvanceSearchTableViewCell


    let userData = allUserArray[indexPath.row] as! [String: Any]

    let dob = userData["dob"] as! String
    let age = self.getAgeFromDate(dob: dob)
    let photo1 = userData["photo1"] as? String
    let height = userData["Height"] as? String ?? "null"
    let religion = userData["Religion"] as? String ?? "null"


    cell.userNameLabel.text = "HM- \(userData["ProfileID"] as!   String)"
    cell.userProfessionLabel.text = userData["Profession"] as? String ?? "null"
    cell.userAgeLabel.text = "\(age), \(height), \(religion)"

    if let profileImage = photo1 {
        urlStringOne = "\(USER_IMAGE_BASE_URL)\(profileImage)"
    } else {
        if (UserDefaults.standard.value(forKey: "gender") as! String    == "Female") {
            urlStringOne = "\(USER_IMAGE_URL_MALE)"
        } else {
            urlStringOne = "\(USER_IMAGE_URL_FEMALE)"
        }
    }

   loadImage(urlStringOne, cell)

    return cell
}


   func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if self.allUserArray.count != nil {

        self.totalEnteries = self.allUserArray.count
        print("idealist/\(self.allUserArray.count)")
        print("total123/\(self.totalEnteries)")

        var entries = allUserArray.count - 1
          print("total-00/\(entries)")

      If indexPath.row == entries {
        print("(----------)")
        if allUserArray.count < totalEnteries {

            var index = allUserArray.count as! String
            self.limit = index + "20"
            while index < self.limit {
                self.allUserArray.append(index)
                index = index + "1"
                }
            self.perform(#selector(self.loadTable), with: nil, afterDelay: 2.0)
          }
        }

}

}
   @objc func loadTable() {
    self.advanceSearchTableView.reloadData()
   }

}
4

3 回答 3

0

我会用一个例子来详细pagination说明tableView。你可以通过它,然后在你的项目中实现它。

1.假设您有一个包含大约 500 个元素的字符串数组。

var allUsers = [String](repeating: "User", count: 500)

2.创建另一个String array最初包含来自 的前 10 个元素allUsers array

var dataSource = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    self.addElements() //explained next..
}

dataSource array作为. dataSource_tableView

3.让我们维护一个offset跟踪index我们需要从中添加接下来 10 个元素的元素,即

var nextOffset = 0

func addElements() {
    let newOffset = nextOffset+10
    for i in nextOffset..<newOffset {
        dataSource.append(allUsers[i])
    }
    nextOffset = newOffset
}

addElements()方法只需添加从 . 开始的下 10 个元素nextOffset

4.UITableViewDataSource方法看起来像,

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataSource.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "\(dataSource[indexPath.row]) : \(indexPath.row)"
    return cell
}

5.现在实现UITableViewDelegate方法 -tableView(_:willDisplay:forRowAt:)

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let currentCount = self.dataSource.count
    if currentCount < 500 && indexPath.row == (currentCount-1) { //last row
        self.addData()
        self.setUpLoaderView(toShow: true)
    } else {
        self.setUpLoaderView(toShow: false)
    }
}

在上述方法中,我检查了cell是否显示最后一个row. 如果是,那么我们使用addData()方法向它添加更多数据,并loaderView在底部显示使用setUpLoaderView(toShow:)方法。

6.这是这两种方法的定义,

func addData() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
        self.addElements()
        self.tableView.reloadData()
    }
}

func setUpLoaderView(toShow: Bool) {
    if toShow {
        self.tableView.tableFooterView?.isHidden = false
        self.tableView.tableFooterView = self.loaderMoreView
    } else {
        self.tableView.tableFooterView = UIView()
    }
}

addData()我根据您的要求添加delay了一个。10 seconds因此,在使用新数据更新之前loader将可见。10 secondstableView

7. loaderMoreView只是一个UIActivityIndicatorView设置为 的tableFooterView,如:

private lazy var loaderMoreView: UIView = {
    let loaderView = UIActivityIndicatorView(style: .whiteLarge)
    loaderView.color = UIColor.gray
    loaderView.startAnimating()
    return loaderView
}()
于 2019-06-21T12:13:29.947 回答
0

我建议您使用 Bond 框架来绑定您的数据。它建立在 RxSwift 之上。因此,在您的情况下,您只需要一个 Mutable Observable Array 并将该数组与您的 tableView 绑定。 let userArray = MutableObservableArray(allUserArray)

userArray.bind(to: collectionView, cellType: UserCell.self) { (cell, name) in
cell.titleLabel.text = name

}

从“willDisplay”调用一个函数并更改数组中的值。使用这种方法,您只需要维护一个数组,它就会自动显示在您的 tableView 中。

https://github.com/DeclarativeHub/Bond

于 2019-06-21T08:40:17.400 回答
0

创建一个标志变量以检查表格现在在哪个单元格上 // var showMore : Bool = false 我建议将您的数组转换为更友好的类型,例如字符串

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if allUserArray.count > 100 && showMore != true {
    return 20
}else if allUserArray.count > 100 && showMore == true {
    return allUserArray.count 
}else {
    return 20
}



func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
     if indexpath.row == 20 
    // append new content if any
    // update flag : showMore = true
    // reload table
}
于 2019-06-21T08:38:35.953 回答