Как создать табличное представление, в котором можно получить 20 строк, а затем добавить весь массив при прокрутке вверх? - PullRequest
2 голосов
/ 21 июня 2019

У меня есть таблица, где я иногда получаю 1000 или 40 или иногда даже 4 значения, но я хочу, чтобы, когда я получил более 100 значений, я хотел отображать свой массив с прокруткой 10 - 10.

Прокручивая просмотр таблицы вверх, мне нужна пауза прокрутки после прокрутки 10 строк, с этим кодом он выдает ошибки, Мой массив в [Любой] и хочет прокрутить как 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()
   }

}

Ответы [ 3 ]

0 голосов
/ 21 июня 2019

Я бы предложил вам использовать Bond framework для привязки ваших данных.Он построен поверх 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

0 голосов
/ 21 июня 2019

Я разработаю pagination в tableView на примере. Вы можете пройти через это и затем внедрить это в свой проект.

1. Предположим, у вас есть массив String, содержащий около 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 seconds до обновления tableView новыми данными.

7. loaderMoreView - это просто UIActivityIndicatorView, установленный как tableFooterView, например:

private lazy var loaderMoreView: UIView = {
    let loaderView = UIActivityIndicatorView(style: .whiteLarge)
    loaderView.color = UIColor.gray
    loaderView.startAnimating()
    return loaderView
}()
0 голосов
/ 21 июня 2019

Создайте переменную флага, чтобы проверить, где сейчас находится таблица, в какой ячейке // var showMore: Bool = false. Я предлагаю преобразовать ваш массив в более дружественный тип, такой как String

 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
}
...