swift - 一般为自动化工具设置可访问性标识符?
问题描述
我们的项目有一个需求。我们需要为大约 40 个视图控制器中的所有组件设置可访问性标识符。我正在考虑如何通过在运行时获取每个视图控制器名称和 iboutlet 名称来实现这些基本工作,并通过将这些值组合为可访问性 id 来生成 id。对于这些,我需要获取 IBOutlet 的名称。我怎样才能做到这一点 ?或者你有什么替代的想法来以另一种方式自动化这个过程?
谢谢。
解决方案
你可以检查这个链接,你会找到一个很好的解决方案来自动设置具有相同名称的变量的可访问性标识符
import UIKit
protocol AccessibilityIdentifierInjector {
func injectAccessibilityIdentifiers()
}
extension AccessibilityIdentifierInjector {
func injectAccessibilityIdentifiers() {
var mirror: Mirror? = Mirror(reflecting: self)
repeat {
if let mirror = mirror {
injectOn(mirror: mirror)
}
mirror = mirror?.superclassMirror
} while (mirror != nil)
}
private func injectOn(mirror: Mirror) {
for (name, value) in mirror.children {
if var value = value as? UIView {
UnsafeMutablePointer(&value)
.pointee
.accessibilityIdentifier = name
}
}
}
}
extension UIViewController: AccessibilityIdentifierInjector {}
extension UIView: AccessibilityIdentifierInjector {}
class BaseView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
injectAccessibilityIdentifiers()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
injectAccessibilityIdentifiers()
}
}
如何使用它
class ViewController: BaseViewController {
let asd1 = BaseView()
let asd2 = BaseView()
let asd3 = BaseView()
let asd4 = BaseView()
let asd5 = BaseView()
let asd6 = BaseView()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
[asd1, asd2, asd3, asd4, asd5, asd6].forEach {
print($0.accessibilityIdentifier)
}
}
}
推荐阅读
- c - 返回错误代码时批处理文件未打开正确的菜单选项
- ios - 如何在swift中用代码模拟点击?
- asp.net-mvc - 应用于控制器时,MVC 属性不适用于单个操作
- android - 如何在 Android Room 中创建部分索引
- java - 在 Android Studio 中进行 Java 编程时,如何将 \n 添加为字符串中的文本?
- c# - 子数组上的 C# LINQ OrderBy
- reporting-services - 如何在 SSRS 中求和“文本框中的 Tablix 列值”
- c++ - 事件(开始,完成),1 天的最大事件。c++中的性能问题
- amazon-web-services - AWS IAM 请求
- reactjs - React native - 如何读取动态表单元素