问题描述
这就是我简单地创建 UIAlertController
并在屏幕上显示的方式:
This is how I simply create UIAlertController
and present it on the screen:
private class func showAlertWithTitle(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
//alert.accessibilityLabel = "my string here" //doesnt work
let action = UIAlertAction(title: "OK", style: .Default) { action in
alert.dismissViewControllerAnimated(true, completion: nil)
}
alert.addAction(action)
UIStoryboard.topViewController()?.presentViewController(alert, animated: true, completion: nil)
}
这就是我在 UITests 下访问它的方式:
and this is how I access it under UITests:
emailAlert = app.alerts["First Name"] //for title "First Name"
但是我想在那里设置自定义标识符并通过 firstName
访问它:
but I would like to set there custom identifier and access this by firstName
like this:
emailAlert = app.alerts["firstName"]
有可能吗?
推荐答案
我想出办法的唯一方法就是使用Apple的私有API。使用此超级密钥在 UIAlertAction
对象上调用 valueForKey
:__ representer
获取什么称为 _UIAlertControllerActionView
。
The only way I figured out to do this was to use Apple's private APIs. You call valueForKey
on the UIAlertAction
object with this super secret key: "__representer"
to get whats called a _UIAlertControllerActionView
.
let alertView = UIAlertController(title: "This is Alert!", message: "This is a message!", preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
alertView.addAction(okAction)
self.presentViewController(alertView, animated: true, completion: {
let alertButton = action.valueForKey("__representer")
let view = alertButton as? UIView
view?.accessibilityIdentifier = "okAction_AID"
})
这必须在完成处理程序中完成,因为在显示视图之前 _UIAlertControllerActionView
将不存在。在我的项目的旁注中,我使用以下扩展来使事情更容易/更易读:
This has to be done in the completion handler because that that _UIAlertControllerActionView
won't exist until the view is presented. On a side note in my project I used these following extensions to make things easier / more readable:
extension UIAlertController {
func applyAccessibilityIdentifiers()
{
for action in actions
{
let label = action.valueForKey("__representer")
let view = label as? UIView
view?.accessibilityIdentifier = action.getAcAccessibilityIdentifier()
}
}
}
extension UIAlertAction
{
private struct AssociatedKeys {
static var AccessabilityIdentifier = "nsh_AccesabilityIdentifier"
}
func setAccessibilityIdentifier(accessabilityIdentifier: String)
{
objc_setAssociatedObject(self, &AssociatedKeys.AccessabilityIdentifier, accessabilityIdentifier, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
func getAcAccessibilityIdentifier() -> String?
{
return objc_getAssociatedObject(self, &AssociatedKeys.AccessabilityIdentifier) as? String
}
}
因此上面的代码将被重写:
So the above code would be rewritten:
let alertView = UIAlertController(title: NSLocalizedString("NMN_LOGINPAGECONTROLLER_ERROR_TITLE", comment: ""), message: message as String, preferredStyle:.Alert)
let okAction = UIAlertAction(title: NSLocalizedString("NMN_OK", comment: ""), style: .Default, handler: nil)
okAction.setAccessibilityIdentifier(InvalidLoginAlertView_AID)
alertView.addAction(okAction)
self.presentViewController(alertView, animated: true, completion: {
alertView.applyAccessibilityIdentifiers()
})
我的第一次尝试涉及尝试导航视图层次结构,但由于 UIAlertControllerActionView
不是公共API的一部分。无论如何,我可能会尝试为应用程序商店提交的构建版本中的 valueForKey(__ representer)
,否则Apple可能会给你打屁股。
My first attempt involved trying to navigate the view hierarchy but that became difficult since UIAlertControllerActionView
was not a part of the public API. Anyway I'd probably would try to ifdef out the valueForKey("__representer")
for builds submitted for the app store or Apple might give you a spanking.
这篇关于如何将accessibilityIdentifier设置为UIAlertController?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!