Xcode复制Target后UICollectionViewCell代码抛出setValue:forUndefinedKey:异常求助
我之前也踩过完全一样的坑!这个setValue:forUndefinedKey:异常本质是:在新Target运行时,系统只能识别到UICollectionViewCell基类,找不到你自定义的PlanetDataCell子类里的moreInfoButton关联,所以才会抛出"not key value coding-compliant"的错误。结合你是复制Target后出现的问题,核心原因大概率是新Target的资源/类成员配置遗漏,给你几个针对性的解决方案:
1. 检查PlanetDataCell类的Target Membership
找到你的PlanetDataCell.swift文件,打开右侧的Identity and Type检查面板,在Target Membership区域,确保新创建的那个Target的复选框是勾选状态的。
复制Target后,Xcode默认不会把原有类自动加入新Target的成员列表,这会导致新Target运行时,无法加载到
PlanetDataCell子类,只能用基类UICollectionViewCell,自然找不到moreInfoButton的关联。
2. 检查定义Cell的Storyboard的Target Membership
找到包含PlanetDataCell的那个Storyboard文件,同样在右侧检查面板的Target Membership里,确认新Target的复选框已勾选。
如果Storyboard没加入新Target,新Target运行时根本加载不到这个自定义Cell的布局定义,会默认创建
UICollectionViewCell实例,触发KVC异常。
3. 修复Storyboard中Cell的类名模块(如果有自定义模块)
打开Storyboard选中PlanetDataCell,在Identity Inspector的Class字段,试试把单纯的PlanetDataCell改成[你的项目模块名].PlanetDataCell(比如你的主项目模块叫SolarSystemApp,就写SolarSystemApp.PlanetDataCell)。
新Target的模块名可能和原Target不同,不加模块前缀的话,系统会在错误的模块里找类,导致加载到基类。
额外验证步骤
- 按住Option键点击Xcode顶部的
Product > Clean Build Folder,彻底清理新Target的构建缓存; - 右键Storyboard里的
moreInfoButton,检查Outlet/Action的关联是否指向PlanetDataCell,有没有红色警告标识,若有则重新关联一次。
按照这个流程排查下来,基本都能解决复制Target后的KVC异常问题。
内容的提问来源于stack exchange,提问作者Dru Freeman

