12
votes

I'm going through our iOS app to fix accessibility issues. One of the features of the app is a UITextField in which the user can enter search queries. I've set the trait of the field to be "search field", and VoiceOver does a good job with the field most of the time. When there's text in the field, it reads the text, then says "search field".

The problem I want to solve is how VoiceOver handles the placeholder text. When the text field is empty, we've set the placeholder text to show a sample query. Since it appears as greyed-out text, sighted users can see that it's just the placeholder text. But VoiceOver doesn't make that distinction for visually impaired users. It just reads the placeholder text the same way as regular text, with no extra description.

Is there a way to add an accessibility trait to a UITextField's placeholder text? Or have people worked around this through other means?

3

3 Answers

3
votes

Derive a custom class from UITextField as follows (code is in Swift but you can adapt to Objective-C):

class MyTextField: UITextField {
    override public var accessibilityValue: String? {
        get { return self.text }
        set { super.accessibilityValue = newValue }
    }
}

Use this class as a custom class instead of UITextField. This will stop VoiceOver from reading the placeholder text when the field is empty.

Then set your accessibility label to e.g. "Search" and accessibility hint to whatever you want to hint (see Apple's Guidelines for Creating Hints). You can assign those values programmatically, though it's probably best to assign them in Interface Builder.

2
votes

I believe you can set the accessibilityLabel and other accessibility properties on an NSString object and then use that string as your placeholder text. Voiceover will discover that property and use it.

NSString *placeholderText = @"Search";
placeholderText.accessibilityLabel = @"Try searching for xxxx";
field.placeholder = placeholderText;

Something like that. Untested, but I saw it in one of the WWDC developer videos.

WARNING: The behavior in iOS 8.0 and up is not as expected.

//In iOS 8+
NSString *placeholderText = @"Search"; //This will be announced
placeholderText.accessibilityLabel = @"Try searching for xxxx";//This will be ignored
field.placeholder = placeholderText;

This answer should be considered outdated.

1
votes

You can't. Traits only make sense on Accessibility Elements. For your UITextField to be "static text" is probably not correct. Setting the trait on the item within the text field will have no effect, even though it may be valid code.

What you can do, is edit the accessibilityLabel of the control.