如何在Swift 4中通过代码获取Xcode中UIView的自定义命名并递归输出?
在Swift 4中访问Xcode重命名的控件名称&递归遍历视图层级调试
嘿,针对你要调试视图层级、zPosition,还要访问Xcode里重命名的控件名称的需求,我整理了一套实用的方案:
一、怎么访问你在IB里改的控件名称?
在Xcode界面里给控件改的有意义名称,分两种场景来访问:
1. 关联了IBOutlet的情况(最常用)
如果你已经把IB里的控件拖到代码里关联成IBOutlet了,那直接用你命名的变量名就能访问啊!比如你把默认的label改成usernameLabel,代码里直接写:
// 直接用变量名操作 usernameLabel.text = "Hello" print("这个label的zPosition是:\(usernameLabel.layer.zPosition)")
这种方式最直接,毕竟你在IB里起的名字就是代码里的变量名嘛。
2. 没关联IBOutlet,只在IB里设了标识的情况
要是你没关联IBOutlet,只是在IB的Identity Inspector里设置了Restoration ID或者Accessibility Identifier(这俩是常用的自定义标识位),可以通过这些属性获取:
- 拿
restorationIdentifier:
if let id = someView.restorationIdentifier { print("这个控件的Restoration ID是:\(id)") }
- 拿
accessibilityIdentifier(苹果更推荐这个,还能支持无障碍测试):
if let id = someView.accessibilityIdentifier { print("这个控件的Accessibility ID是:\(id)") }
小提示:尽量统一用accessibilityIdentifier,既能当标识用,又符合苹果的最佳实践~
二、递归遍历所有控件,输出名称和zPosition等信息
针对你调试父视图、子视图层级的需求,我写了个递归函数,能把整个视图层级的控件信息都打出来,包括名称、类型、zPosition和父视图信息,层级还会用缩进区分,非常直观:
func printViewHierarchy(_ view: UIView, indentation: String = "") { // 优先取你设置的accessibilityIdentifier,没有就用restorationIdentifier,最后用类名当 fallback let viewName = view.accessibilityIdentifier ?? view.restorationIdentifier ?? String(describing: type(of: view)) // 拿到父视图的名称,方便看层级关系 let parentName = view.superview?.accessibilityIdentifier ?? view.superview?.restorationIdentifier ?? String(describing: type(of: view.superview ?? UIView())) // 输出核心信息 print("\(indentation)\(viewName) (\(type(of: view))) | zPosition: \(view.layer.zPosition) | 父视图: \(parentName)") // 递归遍历所有子视图 for subview in view.subviews { printViewHierarchy(subview, indentation: indentation + " ") } } // 使用的时候,传入你的根视图就行,比如当前控制器的view printViewHierarchy(self.view)
这个函数的优势:
- 用缩进区分视图层级,子视图比父视图多两个空格,一眼就能看出谁是谁的子视图
- 名称优先级合理,优先用你自定义的标识,没有的话用类名兜底,不会出现空值
- 输出的zPosition和父视图信息,刚好能帮你排查z轴层级和视图嵌套的问题
三、额外的调试小技巧
要是你需要更详细的信息,比如控件的frame、tag,直接在函数里加就行:
// 比如加上frame信息 print("\(indentation)\(viewName) (\(type(of: view))) | zPosition: \(view.layer.zPosition) | Frame: \(view.frame) | 父视图: \(parentName)")
另外,Xcode自带的Debug View Hierarchy工具也超好用!调试的时候点右上角那个图层图标,就能直观地可视化所有视图的层级、zPosition、frame,和代码输出配合着用,调试效率翻倍~
内容的提问来源于stack exchange,提问作者MACE
相关产品推荐
相关产品推荐

