UIScrollView: бесконечная прокрутка для отображения чисел Фибоначчи - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь позволить пользователю бесконечно прокручивать экран для получения большего числа чисел Фибоначчи.Я могу отображать только количество фибров, равное длине моего массива posts.Вот как это выглядит сейчас.enter image description here У меня проблемы с реализацией функции scrollViewDidScroll для достижения бесконечной прокрутки.Я нашел некоторый код в stackoverflow, который имеет смысл для меня, но я не знаю, что делать, чтобы подключить его к представлению таблицы (той части, где вы вызываете дополнительные данные).Любой вклад приветствуется!

import UIKit

class FeedTableViewController: UITableViewController {

    let posts : [String] = ["","","","","","","",""]
    var fibArray: [Int] = [0,1]
    let cellIdentifier = "userPostFeedCell"

    var indexOfPageToRequest = 1
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let offsetY = scrollView.contentOffset.y
        let contentHeight = scrollView.contentSize.height

        if offsetY > contentHeight - scrollView.frame.size.height {

            // increments the number of the page to request
            indexOfPageToRequest += 1

            // call your API for more data


            // tell the table view to reload with the new data
            self.tableView.reloadData()
        }


    }

    func fibonacci(n: Int) -> Int {
        if (fibArray.count > n) {
            return fibArray[n];
        }

        let fibonacciNumber = fibonacci(n: n - 1) + fibonacci(n: n - 2)
        fibArray.append(fibonacciNumber)
        return fibonacciNumber
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(
            UINib(nibName: "FeedTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
    }


    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

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

        return posts.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> FeedTableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)

        cell.textLabel?.text = "\(fibonacci(n: indexPath.row+1))"
        print("cellForRowAt \(indexPath.row)")


        return cell as! FeedTableViewCell
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        print("heightForRowAt \(indexPath.row)")
        return 40
    }
}

1 Ответ

0 голосов
/ 02 декабря 2018

Вы переполните Int довольно быстро в серии Фибоначчи, так что вам на самом деле не нужна бесконечная прокрутка.Вы просто устанавливаете большое количество строк в своем разделе.Приложение только когда-либо создает ячейки, которые должны отображаться, чтобы вы не использовали большой объем памяти.Вот мой код

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 20000
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
    cell.textLabel?.text = "\(fibonacci(n: indexPath.row+1))"
    return cell
}
...