我在集合View中实现了pull to refresh,而我遇到的问题是我的应用程序会因索引消息而崩溃。下面是我的cellForItem方法
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CauNguyenCell
cell.postArray = postData[indexPath.item]
return cell
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return postData.count
}
我知道问题是因为我使用removeAll方法清除postData中的所有数据,但我必须这样做,所以我的数据数组将有全新的数据。
以下是我的刷新功能:
func handleRefresh(_ refreshControl: UIRefreshControl) {
refreshControl.beginRefreshing()
postData.removeAll()
fetchDataAgain()
self.collectionView.reloadData()
refreshControl.endRefreshing()
}
错误消息:线程1:致命错误:索引超出范围
我只是想问一下是否有人有任何解决问题的建议。谢谢!
答案 0 :(得分:0)
请检查UICollectionViewDataSource
实施方案以了解这些方法:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func numberOfSections(in: UICollectionView)
在第一个项目中,您应该返回当前项目数postData.count
,而您案例中的第二项应返回1
。
答案 1 :(得分:0)
我在项目中实现了同样的功能。首先,我全局创建了refreshControl实例,然后在我的视图控制器中initSetup()
的{{1}}方法调用中设置。
viewDidLoad()
这是从服务器获取数据的调用var refreshControl : UIRefreshControl?
var arrWeddingInvitations = [MyModelClass]()
func initialSetup() {
self.refreshControl = UIRefreshControl()
self.refreshControl?.tintColor = .yellow
self.refreshControl?.addTarget(self, action: #selector(getWeddingInvitations), for: .valueChanged)
self.cvWeddingInvitation.addSubview(refreshControl!)
}
方法。
getWeddingInvitations()
这是我当前项目中的工作代码。我希望这会对你有所帮助。
请参阅以下视频:
答案 2 :(得分:0)
编辑这样的代码:
var emailerror = document.getElementById("emailvalidationerror");
var webpageerror = document.getElementById("webpagevalidationerror");
function validateEmail(email) {
var re = new RegExp("^[^@]+@yahoo.com$");
var re2 = new RegExp("^[^@]+@gmail.com$");
if (!(re.test(email.value)) && !(re2.test(email.value)) || email.value == "") {
emailerror.classList.toggle("triggered");
}
}
function validateWebpage(webpage) {
var re = new RegExp("^www\\.[a-zA-Z0-9_-]+\\.[a-z]+\\.[a-z]+$");
if (!(re.test(webpage.value)) || webpage.value == "") {
webpageerror.classList.toggle("triggered");
}
}
方法fetchDataAgain将检查数组,如果它!= nil并且在处理程序完成reloadData中计数!= 0。
代码一步一步完成,当您在集合中重新加载数据时,您的数组可以为空,或者为零。通常最好使用func fetchDataAgain(completion: ((Bool) -> ())) {
// your code
if postData != nil, postData.count != 0 {
completion(true)
}
}
func handleRefresh(_ refreshControl: UIRefreshControl) {
refreshControl.beginRefreshing()
postData.removeAll()
fetchDataAgain { (complete) in
if complete {
self.collectionView.reloadData()
refreshControl.endRefreshing()
}
}
}