diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index d13cd8a600a..b0f75131286 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -488,6 +488,17 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) { self.accessibilityElement.accessibilityTraits = RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits); + // Re-apply Selected/NotEnabled from the current accessibilityState. The traits + // writer replaces the full bitmask (from role), which doesn't include state bits. + // On a recycled view, accessibilityState may not have changed (so its writer below + // won't fire), but the traits were just overwritten and need the state bits re-applied. + const auto accessibilityState = newViewProps.accessibilityState.value_or(AccessibilityState{}); + if (accessibilityState.selected) { + self.accessibilityTraits |= UIAccessibilityTraitSelected; + } + if (accessibilityState.disabled) { + self.accessibilityTraits |= UIAccessibilityTraitNotEnabled; + } } // `accessibilityState`