reloadData()为每个单元格调用cellForRowAtIndexPath

时间:2017-12-07 05:10:31

标签: ios swift uitableview

所以我遇到这个问题,当在初始API调用之后调用reloadData()时,它调用willDisplayCell方法,当显示最后一个单元格时,将加载更多数据(API返回10个数据)一段时间)。 但是在视图中,它只能显示4-5个单元格,因为我手动将行高设置为175个点。有谁知道为什么会这样? 如果这就是tableView的工作原理我该怎样做才能让我的tableView最初只加载10个?

以下是我的代码。

class MainViewController: UIViewController {

    var tableView: UITableView!
    var photoViewmodel: PhotoViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "Home"
        initTableView()

        photoViewmodel = PhotoViewModel()
        photoViewmodel.loadNewPhotos {
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }

    func initTableView() {
        tableView = UITableView.init(frame: self.view.frame, style: .plain)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = 175
        tableView.separatorStyle = .none
        tableView.register(HomeTableViewCell.nib, forCellReuseIdentifier: HomeTableViewCell.identifier)
        view.addSubview(tableView)
    }
}

extension MainViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("cellForRowAt")
        let cell = tableView.dequeueReusableCell(withIdentifier: HomeTableViewCell.identifier, for: indexPath) as! HomeTableViewCell
        cell.tag = indexPath.row
        cell.configureCell(url: photoViewmodel.photos[indexPath.row].regularImgUrl, cacheKey: indexPath.row)

        return cell
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        print("willDisplay")
        let lastCell = photoViewmodel.photos.count - 1
        if indexPath.row == lastCell {
            print("add 10 more photos")
            photoViewmodel.loadNewPhotos(
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            })
        }
    }
}

0 个答案:

没有答案