web-dev-qa-db-ja.com

accessibilityIdentifierをUIAlertControllerに設定するにはどうすればよいですか?

これは私がUIAlertControllerを作成して画面に表示する方法です。

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)
}

これがITestsでアクセスする方法です。

emailAlert = app.alerts["First Name"] //for title "First Name"

しかし、私はそこにカスタム識別子を設定して、次のようにfirstNameでこれにアクセスしたいと思います。

emailAlert = app.alerts["firstName"]

出来ますか?

これは古いスレッドですが、誰かがこれを使用する可能性があります。

私はこのようにアクセシビリティ識別子を設定することができました:

let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.view.accessibilityIdentifier = "custom_alert"
alert.view.accessibilityValue = "\(title)-\(message)"

alert.addAction(
    UIAlertAction(
        title: "ALERT_BUTTON_OK".localized,
        style: .default,
        handler: handler
    )
)

present(alert, animated: true)

そうすれば、アクセシビリティーIDでアラートにアクセスし、その内容をアクセシビリティー値で確認できます。

もちろん完璧ではありませんが、少なくともAppiumを使用したテストでは機能します。

7
Jan

これを行うために私が考え出した唯一の方法は、AppleのプライベートAPIを使用することでした。 valueForKeyオブジェクトでUIAlertActionを呼び出し、この超秘密鍵:_"__representer"_を使用して、__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_はビューが表示されるまで存在しないため、これは完了ハンドラーで行う必要があります。私のプロジェクトの補足として、以下の拡張機能を使用して物事をより簡単に/読みやすくしました:

_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
    }
}
_

したがって、上記のコードは書き換えられます。

_    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")をifdefしようとするでしょう、またはAppleはあなたに平手打ちを与えるかもしれません。

5
Anthony Olds

現在、UIAlertActionという名前のaddCameraがあり、次のようにしています。

_addCamera.accessibilityLabel = "camera-autocomplete-action-photo"_

これにより、UIテストで次のようにタップできます。

app.sheets.buttons["camera-autocomplete-action-photo"].firstMatch.tap()

1
Alper

Apple docs ...から.

https://developer.Apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/UIAlertView.html

アラートビューにアクセスできるようにする

アラートビューにはデフォルトでアクセスできます。アラートビューのアクセシビリティは、アラートタイトル、アラートメッセージ、およびボタンタイトルに関連しています。 VoiceOverがアクティブになっている場合、アラートが表示されたときに「アラート」という単語が読み上げられ、設定されている場合は、タイトルに続いてメッセージが読み上げられます。ユーザーがボタンをタップすると、VoiceOverはそのタイトルとWordの「ボタン」を読み上げます。ユーザーがテキストフィールドをタップすると、VoiceOverはその値と「テキストフィールド」または「安全なテキストフィールド」を読み上げます。

0
tanya