在emtying数据源字典后,UICollectionView reloadData()崩溃

时间:2017-04-12 09:36:38

标签: swift3 uicollectionview

我有一个UICollectionView,它会获取API搜索的结果。搜索由以下代码触发。结果将附加到字典[[String: Any]],并在查询完成后调用self.collectionView.reloadData()

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    var newValue = textField.text!
    let location = min(range.location, newValue.characters.count)
    let startIndex = newValue.characters.index(newValue.startIndex, offsetBy: location)
    let endIndex = newValue.characters.index(newValue.startIndex, offsetBy: location + range.length)
    let newRangeValue = Range<String.Index>(startIndex ..< endIndex)
    newValue.replaceSubrange(newRangeValue, with: string)

    searchView.searchFieldValueChanged(newValue)

    return true
}

然后,如果我想更改搜索字符串并再次搜索,我想要清空字典并再次调用reloadData(),我的应用程序崩溃。

错误是

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist:

这是我的数据源实现

var searchResults = [[String: Any]]()


    let layout: UICollectionViewFlowLayout = {
        let layout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
        layout.estimatedItemSize.height = 200
        layout.estimatedItemSize.width = 200
        layout.minimumInteritemSpacing = 10
        layout.minimumLineSpacing = 10
        return layout
    }()

    collectionView = UICollectionView(frame: self.frame, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.register(LanesCollectionViewCell.self, forCellWithReuseIdentifier: cellId)
    collectionView.backgroundColor = .yellow // Constants.APP_BACKGROUND_COLOR
    collectionView.alwaysBounceVertical = true
    collectionView.clipsToBounds = true
    collectionView.translatesAutoresizingMaskIntoConstraints = false

func numberOfSections(in collectionView: UICollectionView) -> Int {

    return 1
}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if searchResults.count == 0 {
        collectionView.alpha = 0.0
    } else {
            collectionView.alpha = 1.0
    }
    return searchResults.count
}
查询后

func parseMoreData(jsonData: [String: Any]) {

    let items = jsonData["items"] as! [[String: Any]]

        self.collectionView.layoutIfNeeded()

        self.collectionView.reloadData()
    }
}

func searchFieldValueChanged(_ textValue: String) {

    searchResults = []

1 个答案:

答案 0 :(得分:2)

通过使用此代替layoutIfNeeded()

来解决此问题
 collectionView.reloadData()

 collectionView.collectionViewLayout.invalidateLayout()