iOS技术问题:子类化UICollectionViewCell后因gridTitle未识别选择器崩溃
兄弟,这个崩溃我太熟了!先给你拆解下错误核心:你代码里有个__NSCFDictionary(也就是iOS的字典对象),你却试图调用它根本没有的gridTitle方法,这直接触发了NSInvalidArgumentException异常。说白了就是——你给UICollectionViewCell传的数据类型错了:你以为传的是自定义的GridItem模型,实际传的是个字典。
下面给你一步步排查解决的方法:
先检查数据源数组的元素类型
你用来填充UICollectionView的数据源数组(比如叫dataSourceArray),里面的元素必须是你自定义的GridItem实例,不能是从JSON解析出来的原始字典。你可以在数据加载完成的地方,打印数组元素的类型,看看是不是混进了字典。比如从网络请求拿到JSON后,有没有把字典转换成GridItem对象再放进数组?如果直接存字典,肯定会出问题。检查
cellForItemAt的配置代码
找到你配置cell的那段代码,比如:func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GridCell", for: indexPath) as! GridCell let item = dataSourceArray[indexPath.row] cell.titleLabel.text = item.gridTitle // 这里就是崩溃点! return cell }这里的
item如果是字典,调用gridTitle自然会崩溃。你要确保item是GridItem类型,最好加个安全转换兜底:guard let item = dataSourceArray[indexPath.row] as? GridItem else { print("⚠️ 数据类型错误,不是GridItem") return cell } cell.titleLabel.text = item.gridTitle这样即使有错误数据,也不会崩溃,还能打印日志帮你定位问题。
检查自定义模型的初始化逻辑
如果你是用字典转GridItem模型,有没有正确实现初始化方法?比如你的GridItem应该有类似这样的代码:class GridItem: NSObject { var gridTitle: String? init(dictionary: [String: Any]) { super.init() self.gridTitle = dictionary["title"] as? String // 这里要对应你JSON里的实际key } }要是你没写这个初始化逻辑,直接把字典塞进数据源数组,那肯定会把字典当成模型用,最终导致崩溃。
用断点快速定位问题根源
在cellForItemAt方法里打个断点,运行到崩溃位置时,查看dataSourceArray[indexPath.row]的实际类型。如果是字典,就顺着代码找这个字典是怎么进到数组里的——是不是网络请求解析后没转模型?还是某个地方不小心把字典添加到了数据源数组里?
按照这几步排查,基本就能快速定位并解决问题了。
内容的提问来源于stack exchange,提问作者何东洲

