我们在项目中有一个要求。我们需要为大约40个视图控制器中的所有组件设置可访问性标识符。我正在考虑如何通过在运行时获取每个视图控制器名称和iboutlet名称来实现这些基本工作,并通过将这些值组合为可访问性ID来生成ID。对于这些,我需要获取IBOutlet的名称。我怎样才能做到这一点 ?还是您有其他选择来以另一种方式来自动化该过程?
谢谢。
答案 0 :(得分:0)
您可以尝试Sourcery
它能够解析所有源文件并为您提供有关所有控制器的IBOutlets
的信息:
您对classes -> variables -> attributes
您可以为所有此类变量didSet
块生成内联,您将在其中设置适当的可访问性标识符
答案 1 :(得分:0)
你可以查看这个链接,你会发现一个很好的解决方案来自动设置与变量同名的accessibilityIdentifier
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)
}
}
}