[iOS] Switch with a role that has no iOS trait stops being a switch to accessibility after it is disabled and re-enabled
Les mainteneurs répondent en général sous 2 jours
@r1shabhsharma05 y travaille déjà.
Depuis le 22/10/2026.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 72/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- ios, objective-c, react-native
- Domaine
- accessibility, mobile
Piste de recherche
Start by reading the accessibility trait update path in RCTViewComponentView and how RCTSwitchComponentView exposes its inner UISwitch as the accessibility element. Compare the traits on mount with those written after disabling and re-enabling a switch whose role maps to no iOS trait. Done when the role reported to accessibility remains consistent through that cycle; the issue provides a reproducer and observed accessibility tree to check.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Description
On iOS, a Switch whose role maps to no iOS accessibility trait, such as accessibilityRole="none" or accessibilityRole="checkbox", is reported to accessibility as a switch on mount. Once its accessibilityState.disabled goes from true back to false, it is reported as a generic element instead, and stays that way. A Switch with the default role stays a switch throughout.
The inner UISwitch is the Switch's accessibility element (RCTSwitchComponentView), and RCTViewComponentView writes the traits derived from the role and accessibilityState onto it only when they change:
- On mount the derived traits are
None, the same as the default, so nothing is written and theUISwitchkeeps UIKit's own traits, including the switch trait. - When disabled, the derived traits are
NotEnabled, which replaces UIKit's traits. - When enabled again, the derived traits go back to
None. That now differs from the previous value, so0is written explicitly and UIKit's switch trait does not come back.
Expected: the Switch is reported with the same role before and after a disable and enable cycle. Whether that role should be UIKit's switch or the one the role asks for, it should not depend on whether the Switch has been disabled before.
Related: #59333 makes disabled set accessibilityState.disabled on iOS, as Android already does. With that change, toggling disabled alone also triggers this.
Steps to reproduce
- Clone the reproducer, then
cd ReproducerApp && npm install && (cd ios && bundle install && bundle exec pod install)andnpx react-native run-ios. - Inspect the three switches with Accessibility Inspector: all three are switches.
- Press "Disable switches", then "Enable switches".
- Inspect them again: the
role="none"androle="checkbox"switches are now generic elements. The default-role switch is still a switch.
The app renders:
<Switch value disabled={disabled} accessibilityState={{disabled}} />
<Switch value disabled={disabled} accessibilityRole="none" accessibilityState={{disabled}} />
<Switch value disabled={disabled} accessibilityRole="checkbox" accessibilityState={{disabled}} />
React Native Version
0.88.0
Affected Platforms
Runtime - iOS, Build - MacOS
Areas
Fabric - The New Renderer
Output of npx @react-native-community/cli info
System:
OS: macOS 26.6.2
CPU: (8) arm64 Apple M5 Pro (Virtual)
Memory: 135.64 MB / 16.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 24.20.0
path: ~/.fnm/bin/node
Yarn:
version: 1.22.22
path: ~/.fnm/bin/yarn
npm:
version: 11.19.0
path: ~/.fnm/bin/npm
Watchman: Not Found
Managers:
CocoaPods:
version: 1.17.0
path: /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 27.0
- iOS 27.0
- macOS 27.0
- tvOS 27.0
- visionOS 27.0
- watchOS 27.0
Android SDK: Not Found
IDEs:
Android Studio: Not Found
Xcode:
version: 27.0/27A5228h
path: /usr/bin/xcodebuild
Languages:
Java: Not Found
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli":
installed: 20.2.0
wanted: 20.2.0
react:
installed: 19.3.0
wanted: 19.3.0
react-native:
installed: 0.88.0
wanted: 0.88.0
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: true
iOS:
hermesEnabled: true
newArchEnabled: true
Stacktrace or Logs
No crash. Accessibility tree read with `axe describe-ui` (https://github.com/cameroncooke/AXe) on an iPhone 17 Pro simulator, iOS 27:
1. On mount
role-default CheckBox role_description='switch' enabled=True
role-none CheckBox role_description='switch' enabled=True
role-checkbox CheckBox role_description='switch' enabled=True
2. After "Disable switches"
role-default CheckBox role_description='switch' enabled=False
role-none GenericElement role_description='' enabled=False
role-checkbox GenericElement role_description='' enabled=False
3. After "Enable switches"
role-default CheckBox role_description='switch' enabled=True
role-none GenericElement role_description='' enabled=True
role-checkbox GenericElement role_description='' enabled=True
MANDATORY Reproducer
https://github.com/arun279/rn-switch-role-a11y-reproducer
Screenshots and Videos
Nothing visual: the switches look the same before and after. The difference is only in the accessibility tree (see the logs above).
- Langage dominant
- C++
- Étoiles
- 127k
- Forks
- 25.5k
- Merge moyen
- 3 j 18 h
- PR mergées (30 j)
- 188
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de react/react-native
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
react/react-native#59945 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
react/react-native#59944 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
react/react-native#59942 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
react/react-native#59939 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
react/react-native#59929 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de react/react-native
Issues similaires
-
test(tools): two testkit cache tests fail unless GOCACHE and GOMODCACHE are in the environmentOuvertebacklog
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
EchoTools/nevr-runtime#2385 ·
Les mainteneurs répondent en général sous 1 jour
-
type:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
tensorflow/tflite-micro#3995 ·
Les mainteneurs répondent en général sous 1 jour
-
CPU update 1.31xOuvertespeed-report
Difficulté 1/5 Moins d'une heure Accessibilité débutants 75/100
mw00/project-maya#961 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
not for AI lovers
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
OSGeo/gdal#15515 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour