2017-08-23 9 views
0

Ich habe eine Schaltfläche mit Accessibility Label @"a". Wenn die Schaltfläche gedrückt wird, habe ich einen Rückruf, der die Zugänglichkeitsbeschriftung button.accessibilityLabel = @"b" setzt. Ich weiß, dass diese Codezeile ausgeführt wird. Wenn ich jedoch erneut auf die Schaltfläche klicke, liest VoiceOver immer noch a. Leider ist der Code, mit dem ich arbeite, proprietär, daher kann ich ihn nicht direkt teilen.iOS Aktualisieren Accessibility Label

Im Allgemeinen möchte ich jedoch wissen, welche Probleme dazu führen können, dass VoiceOver ein Update für ein Label nicht erkennt.

+1

Ihre Frage ist nicht klar, versuchen Sie, Ihren Code & was Sie versuchten –

+2

Ihre Frage ist nicht klar –

+1

Unklarheit in dem, was gefragt wird, ist aufgrund der Ignoranz des Lesers. Das ist eine gute Frage, mit einer wertvollen Antwort. – ChrisCM

Antwort

-3

Sie brauchen nicht wirklich einen Weg zu aktualisieren die Voice-over-Etiketten. Es ist automatisch erledigt. Ich habe das versucht und es funktioniert wie erwartet.

class ViewController: UIViewController { 

    var tapCount = 0 

    var button: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     button = UIButton(type: .system) 
     button.setTitle("Hello", for: .normal) 
     button.frame = CGRect(x: 10, y: 10, width: 100, height: 50) 
     view.addSubview(button) 

     button.accessibilityLabel = "Hello Button" 
     button.accessibilityHint = "Tap here to start the action" 
     button.accessibilityIdentifier = "hello_button" 
     button.addTarget(self, action: #selector(buttonTap(sender:)), for: .touchUpInside) 
    } 

    @IBAction func buttonTap(sender:UIButton) { 
     tapCount = tapCount + 1 
     sender.accessibilityLabel = "Hello button, tapped \(tapCount) times" 
    } 
} 

Was oversays Voice:

Hallo Knopf -pause- Knopf -pause- Tippen Sie hier die Aktion zu starten

Auf Taste tippen

Hallo-Taste , angezapft einmal

Ein weiterer Hahn

Hallo-Taste, tippte zweimal

+0

Topicstarter macht das gleiche, aber VoiceOver fangen keine Bearbeitung – GRiMe2D

+0

Downvoters Ich brauche Sie wertvolle Kommentare, um dies zu verbessern. – BangOperator

+0

@ GRiMe2D, woher weißt du, dass thomestarter das gleiche getan hat? Ich habe einen einfachen Ausschnitt eingefügt, wie das funktioniert, damit das OP nichts Wesentliches vermisst. Wenn der Fall des OP anders ist, können wir die Frage sowohl aktualisieren als auch beantworten. – BangOperator

1

Try UIAccessibilityTraitUpdatesFrequently, um Ihre Schaltflächen accessibilityTraits Eigenschaft hinzufügen

- (void)viewDidLoad { 
    myButton.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently 
} 

Auch wenn accessibilityLabel sicher sein, zu ändern, dass Sie auf dem Haupt sind Faden.

dispatch_async(dispatch_get_main_queue(), ^{ 
    myButton.accessibilityLabel = @"b"; 
}); 
+0

Danke für den Vorschlag. Ich habe tatsächlich nicht vom Haupt-Thread aus angerufen. Wenn ich jedoch den Dispatch_async-Block wie von Ihnen vorgeschlagen verwende, liest VoiceOver immer noch das alte Label. Irgendwelche anderen Ideen? – kmell96

+0

@ kmell96, VoiceOver liest das Label sofort nach dem Tippen (wie Sie mit der Calculator App sehen können), versuchen, 'accessibilityLabel' gleich nach dem Tippen auf' nil' zu setzen und im Callback auf '@" b "' – GRiMe2D

+1

Verweis auf UIAccessibilityTraitUpdatesFrequently ist irreführend in Bezug auf diesen Zweck. Der Rest dieses Beitrags ist angemessen. – ChrisCM

2

der beste Weg, dynamische Zugänglichkeit Etiketten zu handhaben ist, um die Eigenschaftsfunktionen auf den Ansichten außer Kraft zu setzen, die fokussiert werden (EX: auf einem UIButton). Dies ermöglicht ZWEI Dinge. A: Es ist viel einfacher zu warten, als die Eigenschaft überall dort einzustellen, wo sie sich ändern kann. B: Sie können Informationen protokollieren und sehen, wann das System diese Informationen anfordert, damit Sie besser verstehen, WARUM die Dinge passieren. Auch wenn es Ihr Problem nicht direkt behebt, ist es von Natur aus wertvoll zu sehen, WENN das System Ihren Wert anfordert und diese Daten protokolliert.

dies tun in Objective C

@implementation YourUIButton 

-(NSString*)accessibilityLabel { 
    if(someCondition) { 
     return @"a"; 
    } else { 
     return @"b"; 
    } 
} 

@end 

In Swift

public class YourUIButton : UIButton 
    override public var accessibilityLabel: String? { 
     get { 
      if (someCondition) { 
       return "a" 
      } else { 
       return "b" 
      } 
     } 

     set { 
      NSException.raise(NSException("AccessibilityLabelException", "You should not set this accessibility label.", blah)) 
     } 
    } 
} 

könnten Sie auch diese Logik Anwendung zu debuggen und erlauben Einstellung und so weiter.

Hier gibt es viele mögliche Probleme. Race conditions, welche View tatsächlich den Fokus erhält, gibt es eine Parent-Child-Beziehung usw. Das Überschreiben der Property und das Hinzufügen von Logging-Anweisungen zum obigen Code wird Ihnen helfen zu verstehen, welche View das Accessibility-Label wann angefordert bekommt. Super wertvolle Information!

Verwandte Themen