Xamarin.iOS中如何定位设置用户定义检查属性失败的UIButton
报错原因
该报错的本质是你在Storyboard中给某个UIButton配置了名为
localizedText的用户定义运行时属性(User Defined Runtime Attributes),但系统原生UIButton类本身没有localizedText这个属性,触发了KVC赋值失败。报错中的内存地址是运行时生成的实例地址,确实无法在静态的Storyboard源码中检索到,不需要以内存地址为排查依据。
该问题通常出现的场景为:你之前将该按钮设置为带localizedText属性的自定义子类,后续改回原生UIButton时没有删除之前配置的用户定义运行时属性。
方法1:可视化界面排查(最简便)
- 打开项目中的目标Storyboard文件,切换到可视化编辑界面
- 点击左侧文档大纲(Document Outline)顶部的搜索框,输入
UIButton筛选出当前Storyboard中所有的按钮组件 - 逐个选中按钮,打开右侧检查器面板的「身份检查器」(Identity Inspector,第三个带身份证图标的标签页)
- 下拉到面板底部的「用户定义运行时属性」区域,只要找到任意一个按钮的属性列表里存在Key为
localizedText的条目,就是出错的组件 - 直接删除该无效属性条目即可解决报错
方法2:检索Storyboard源码定位
- 右键点击Storyboard文件,选择「Open As -> Source Code」打开底层XML源码
- 直接检索关键词
localizedText,所有匹配的条目都是配置了该无效属性的控件,对应的XML节点会标注控件ID、所属页面等信息,可以直接定位到对应按钮 - 删除匹配到的
<userDefinedRuntimeAttribute>节点即可
方法3:运行时断点定位(前两种方法无法找到时使用)
- 打开Xcode断点导航器,添加一个「Symbolic Breakpoint」
- 符号设置为
-[NSException raise] - 运行项目,触发报错时会自动断住,此时在lldb控制台输入
po 0x14dd3dc40(替换为你报错中的实际内存地址),可以打印出该按钮的额外标识信息,比如所属页面、restoration ID、 accessibility identifier等你提前配置的标识,即可对应到具体按钮
内容的提问来源于stack exchange,提问作者Cliffhanger
相关产品推荐
相关产品推荐

