Swift TableПросмотреть больше Кнопка загрузки - PullRequest
0 голосов
/ 14 января 2020

Я искал много веб-сайтов / страниц, в основном это касается цели - c.

У меня есть (неограниченные) данные типа FavoriteViewController, в которых хранится то, что вам нравится отображать на столе. Но сначала я покажу только 20 записей, а когда пользователь щелкнет последнюю строку (кнопка «Загрузить еще»), таблица будет содержать строки из следующих 20 записей.

Я использую RealM, а ниже указан мой код

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
  let cell = tableView.dequeueReusableCell(withIdentifier: "main", for: indexPath) as! favouriteTableViewCell
  ...
  return cell
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let maxCell : Int = 20
    let cell = tableView.dequeueReusableCell(withIdentifier: "main", for: indexPath) as! favouriteTableViewCell
    cell.number = indexPath.row
    if cell.number > maxCell {
        let view = UIView()
        let moreButton = UIButton()
        moreButton.addTarget(self, action: #selector(moreButtonClick(_ :)), for: .touchUpInside)
        self.tableView.tableFooterView = view
        view.addSubview(moreButton)
    }
 tableView.reloadData()
}

@objc func moreButtonClick(_ sender: Any) {
    print("load more")
}

У меня вопрос: как я могу сначала отобразить 20 записей, и как я могу нажать кнопку more и отобразить еще 20 записей?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Из того, что я понял, постер хочет загрузить определенное количество предметов из Realm и отобразить их в табличном представлении. Затем, когда пользователь нажимает кнопку «Далее», он загружает следующий набор элементов. Это иногда называется разбиением на страницы.

Начиная с объекта Realm

class ItemClass: Object {
    @objc dynamic var item_name = ""
    @objc dynamic var item_index = ""
}

, а затем объекта результатов класса, который мы будем использовать в качестве источника данных вместе с целочисленной переменной для отслеживания того, что первый элемент находится в наборе отображаемых данных

var itemResults: Results<ItemClass>!
var startingIndex = 0

, затем мы создадим 20 тестовых элементов в области с именем Item X и индексом, являющимся целочисленным индексом элемента.

var itemArray = [ItemClass]()

for i in 0..<20 {
    let item = ItemClass()
    let num = "Item \(i)"
    item.item_number = num
    item.index = i
    try realm.write {
       realm.add(item)
    }
}

При первом запуске приложения мы загрузим 5 элементов из Realm и заполним наш источник данных tableView. Эти элементы будут элементами с индексами 0, 1, 2, 3, 4

func loadItems() {
    let realm = try! Realm()
    self.itemResults = realm.objects(ItemClass.self).filter("index >= 0 AND index <=4").sorted(byKeyPath: "index")
    //the next time data is loaded, we'll start with item at index of 5
    self.startingIndex = 5 
}

, затем у нас будет кнопка, которую пользователь нажимает, чтобы загрузить еще 5 и заменить отображаемые. При первом нажатии кнопки будут загружены элементы с индексами 5, 6, 7, 8, 9. При следующем нажатии кнопки будет загружено 10, 11, 12, 13, 14. Et c et c.

func handleTestButton2Action() {
    let endingIndex = self.startingIndex + 4
    let realm = try! Realm()
    self.itemResults = realm.objects(ItemClass.self).filter("index >= %i AND index <= %i", self.startingIndex, endingIndex).sorted(byKeyPath: "index")
    self.startingIndex = endingIndex + 1
    self.itemTableView.reloadData()
}
0 голосов
/ 14 января 2020

Вы можете сделать что-то вроде этого:

class FavouriteViewController: UIViewController,
UITableViewDataSource,
UITableViewDelegate,
CustomFooterDelegate {

@IBOutlet weak var tableView: UITableView!

let resultsStep = 20
var maxResults : Int = 20
var allItems = Result<FavoriteItem>!
var favouriteList: Result<FavoriteItem>!


override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    loadResults()
}

func loadResults() {
    allItems = realm.objects(FavoriteItem.self)
    limitShownItems()
}

func limitShownItems() {
    favouriteList = allItems.prefix(maxResults)
}

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

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

    return cell
}


func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomFooter") as! CustomFooter
    view.delegate = self

    return view
}


//MARK: - CustomFooterDelegate
func didTapAddMoreResults(view: CustomFooter) {
    maxResults = maxResults + resultsStep
    limitShownItems()
    tableView.reloadData()

}

}

Я не сделал тест или что-то, надеюсь, это работает: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...