拉动以刷新崩溃应用程序,因为索引超出范围

时间:2018-03-24 07:51:41

标签: ios swift uicollectionview

我在集合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:致命错误:索引超出范围

我只是想问一下是否有人有任何解决问题的建议。谢谢!

3 个答案:

答案 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()

这是我当前项目中的工作代码。我希望这会对你有所帮助。

请参阅以下视频:

Pull to refresh test video

答案 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() } } }