比如 需要修改系统的badgeValue的背景图片
1.可以打开渲染模式 选中要修改的控件
2.看顶部出现的控件的层次
3.将层次截取出来 并找出我们当前可以取到的控件 ,现在我们可以取到的控件就是tabbar
4.然后在对应的控制器中 通过遍历控件的方式找到控件
private func demo { //取出我们可以取到的控件 let tabbar = self.tabBarController!.tabBar //根据我们截取的控件层次 遍历控件 for tabbarChild in tabbar.subviews{ //判断遍历到的控件是否是我们想要的控件的类型 if tabbarChild.isKindOfClass(NSClassFromString("UITabBarButton")!){ for tabBarButtonChild in tabbarChild.subviews{ if tabBarButtonChild.isKindOfClass(NSClassFromString("_UIBadgeView")!){ for badgeViewChild in tabBarButtonChild.subviews{ if badgeViewChild.isKindOfClass(NSClassFromString("_UIBadgeBackground")!){ print("找到了") } } } } } } }
5.通过上面的操作 已经将控件找到 ,接下来是要确定我们需要设置的控件的属性名字是什么
print("找到了") var count : UInt32 = 0 //找到这个控件之后 开始设置它的属性 /第一个参数 传入 类 第二个参数是 返回这个类的属性的个数 ivarList = class_copyIvarList(NSClassFromString("_UIBadgeBackground")!, &count) //根据个数 遍历属性 for i in 0..<count{ //获得属性 let ivar = ivarList[Int(i)] //将属性转换为 int8 let name = ivar_getName(ivar) type = ivar_getTypeEncoding(ivar) //将int8 转换为 字符串 let nameStr = String(CString: name, encoding: NSUTF8StringEncoding) let typeStr = String(CString: type, encoding: NSUTF8StringEncoding) print(nameStr) //打印查看属性名称,打印结果 image print(typeStr) //打印查看属性类型,打印结果 UIImage }
6.获得控件和属性之后 通过kvc 模式给对应控件的属性进行赋值
badgeViewChild.setValue(UIImage(named: "main_badge"), forKeyPath: "_image")
1.判断是否是某一种类型的方法 以及通过字符串转换成类的方法
tabBarChild.isKindOfClass(NSClassFromString("UITabBarButton")!)
2.获取类的成员变量数组 的方法,按住option键后查看返回结果的类型并不是数组,但是可以遍历,遍历得到的数据是ivar ,
第一个参数传入一个类 第二个参数传入一个接收结果数量的地址
class_copyIvarList(NSClassFromString("_UIBadgeBackground")!, &count)
并且获取 类的“方法” “ 属性 ” “协议”的方法类似 传的参数都是一样的
3.将ivar转换为Int8类型
ivar_getName(ivar)方法都是有规律可循的,类似的 还有
4.将Int8转换为字符串的方法
String(CString: name, encoding: NSUTF8StringEncoding)