最近使用MacCatalyst写Demo时,发现捕捉UICollectionViewCell的选中状态有点难受
发现的问题有:
- isSelected 状态不受你的控制
-
- 允许多选状态下allowsMultipleSelection = true 在Mac与其他设备上如IPad、IPhone、IPod 表现形式不一致
- 2.1 操作不一致,Mac上多选需要使用cmd功能键
- 2.2 代理执行方法不一致,主要观察代理方法:
didSelectItemAtIndexPath
与didDeselectItemAtIndexPath
- 3 如果didSelectItemAtIndexPath方法里面使用了
reloadItemsAtIndexPaths
或者reloadData
这两个方法时,didDeselectItemAtIndexPath
将再也不会被执行,但是在MacCatalyst上表现例外,几乎每次都走。参考分析文章。
正确的解决方案:
- 1.跳出框架能力限制,不要使用系统的属性来管理状态位,要使用自己创建ViewModel 数据来管理cell的选中状态。
- 2.尽量不要使用allowsMultipleSelection去设置多选,默认设置为false,使用自己的状态数据为来管理单选或者时多选的状态和显示效果。
- 3.更新View的界面效果的操作,不要自己直接去修改view属性,正确的方法是:尽量在修改viewMode 后 加上更新机制(
reloadItemsAtIndexPaths
或者reloadData
)来更新view的界面效果。- 这样还有个好处,可以直接忽略掉
didDeselectItemAtIndexPath
这个方法(MacCatalyst上虽然也走这个方法,但是也可以直接忽略,或者仅仅做个标记)
- 这样还有个好处,可以直接忽略掉
这个解决方案,采用典型的MVVM设计模式。MVVM也是当前主流的合理的设计模式,做开发一定要跳出API的限制,结合优秀的设计模式来解决问题。