UITableView滚动到不需要的索引或位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableView滚动到不需要的索引或位置相关的知识,希望对你有一定的参考价值。
基本上任务是加载新的API响应,因为用户在UITableView
中向下滚动而不停止用户交互并维持当前位置(Facebook和Instagram等实时源)。
我想要做的是解析然后在UITableView
中使用自定义单元格查看Rest API的响应。
问题在于,当用户滚动到底部时,进行API调用并且表视图滚动到用户所在的其他位置。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "xxxxx", for:indexPath) as! xxxxxxxx
return cell;
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if scrollView == tableView {
if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height) {
print("Scroll Ended")
fetchDataFromApi()
}
}
}
func fetchDataFromApi() {
let jsonUrlString = "xxxxxxx"
guard let url = URL(string: jsonUrlString) else {
return
}
print(url)
URLSession.shared.dataTask(with: url) {(data,response,err) in
guard let data = data else {
return
}
do {
let apiResponseData = try JSONDecoder().decode(ApiResponse.self, from: data)
if apiResponseData.httpStatusCode == HttpStatusCode.OK {
if let apiResponse = apiResponseData.data{
self.array.append(contentsOf: apiResponse)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
else {
print("API Response Error : (apiResponseData.httpStatusCode) (apiResponseData.errorMessage)")
}
}catch let jsonErr {
print("Serialization Error (jsonErr)")
}
}.resume()
}}
答案
试试这个
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "xxxxx", for:indexPath) as! xxxxxxxx
let lastRowIndex = tableView.numberOfRows(inSection: tableView.numberOfSections-1)
if (indexPath.row == lastRowIndex - 1) {
//print("last row selected")
fetchDataFromApi()
}
return cell;
}
如果您正在使用它,则无需调用此方法
scrollViewDidEndDragging
另一答案
尝试insertCellAtIndexPath
替换tableview.reloadData()
in
if let apiResponse = apiResponseData.data{
self.array.append(contentsOf: apiResponse)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
......
另一答案
有几种方法可以实现这一点。据我所知,最有利的是实现一个分页API并在UITableView的最后一项后调用API。你可以使用:
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let botEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (botEdge >= scrollView.contentSize.height)
{
// Call API and reload TableView on completion handler.
}
}
在API方法的完成处理程序上调用tableView reload。
或者你可以稍微尴尬的方式做到这一点:
public var indexPathsForVisibleRows: [NSIndexPath]? { get }
获取当前可见单元格的索引路径数组,并在使用以下命令重新加载UITableView后滚动到索引:
tableView.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.None, animated: false)
另一答案
这是因为我在表格视图中设置了动态单元格大小
以上是关于UITableView滚动到不需要的索引或位置的主要内容,如果未能解决你的问题,请参考以下文章
(Swift) UITableView - 尝试将索引路径移动到不存在的索引路径