UITableView转UICollectionView选中行获取报错,求修改方案
UITableView替换为UICollectionView后获取选中项报错解决
原UITableView获取选中行代码:
let selectedRow = MarketView.indexPathForSelectedRow!.row
替换为UICollectionView后尝试的代码:
let selectedRow = MarketView.indexPathsForSelectedItems!.first
报错提示:Cannot convert value of type 'IndexPath?' to expected argument type 'Int'
问题原因
UICollectionView的indexPathsForSelectedItems返回的是[IndexPath]?(可选的IndexPath数组),调用.first得到的是IndexPath?类型,而你需要的是原逻辑中的Int类型行号,类型不匹配导致报错。另外UICollectionView默认支持多选,这和UITableView默认单选的逻辑存在差异。
解决方法
1. 获取选中项的行号(和原逻辑一致的Int类型)
推荐使用安全解包避免崩溃:
if let selectedIndexPath = MarketView.indexPathsForSelectedItems?.first { let selectedRow = selectedIndexPath.row // 后续使用selectedRow的逻辑写在这里 }
如果确认当前必有选中项(不推荐强制解包,极端情况会引发崩溃):
let selectedRow = MarketView.indexPathsForSelectedItems!.first!.row
2. 获取完整的IndexPath(如需同时使用section和row)
如果业务需要用到分区和行号,直接保留IndexPath类型:
if let selectedIndexPath = MarketView.indexPathsForSelectedItems?.first { let section = selectedIndexPath.section let row = selectedIndexPath.row // 处理section和row的逻辑 }
额外提示
如果你的UICollectionView是单选场景,记得在初始化或配置时设置:
MarketView.allowsMultipleSelection = false
这样indexPathsForSelectedItems数组最多只会有一个元素,和原UITableView的单选逻辑对齐。
内容的提问来源于stack exchange,提问作者lin lin
相关产品推荐
相关产品推荐

