RCTSwitchManager.m 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import "RCTSwitchManager.h"
  8. #import <React/RCTUIManager.h>
  9. #import "RCTBridge.h"
  10. #import "RCTEventDispatcher.h"
  11. #import "RCTSwitch.h"
  12. #import "UIView+React.h"
  13. @implementation RCTSwitchManager
  14. RCT_EXPORT_MODULE()
  15. - (UIView *)view
  16. {
  17. RCTSwitch *switcher = [RCTSwitch new];
  18. [switcher addTarget:self action:@selector(onChange:) forControlEvents:UIControlEventValueChanged];
  19. return switcher;
  20. }
  21. - (void)onChange:(RCTSwitch *)sender
  22. {
  23. if (sender.wasOn != sender.on) {
  24. if (sender.onChange) {
  25. sender.onChange(@{@"value" : @(sender.on)});
  26. }
  27. sender.wasOn = sender.on;
  28. }
  29. }
  30. RCT_EXPORT_METHOD(setValue : (nonnull NSNumber *)viewTag toValue : (BOOL)value)
  31. {
  32. [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
  33. UIView *view = viewRegistry[viewTag];
  34. if ([view isKindOfClass:[UISwitch class]]) {
  35. [(UISwitch *)view setOn:value animated:NO];
  36. } else {
  37. UIView *subview = view.subviews.firstObject;
  38. if ([subview isKindOfClass:[UISwitch class]]) {
  39. [(UISwitch *)subview setOn:value animated:NO];
  40. } else {
  41. RCTLogError(@"view type must be UISwitch");
  42. }
  43. }
  44. }];
  45. }
  46. RCT_EXPORT_VIEW_PROPERTY(onTintColor, UIColor);
  47. RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor);
  48. RCT_EXPORT_VIEW_PROPERTY(thumbTintColor, UIColor);
  49. RCT_REMAP_VIEW_PROPERTY(value, on, BOOL);
  50. RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock);
  51. RCT_CUSTOM_VIEW_PROPERTY(disabled, BOOL, RCTSwitch)
  52. {
  53. if (json) {
  54. view.enabled = !([RCTConvert BOOL:json]);
  55. } else {
  56. view.enabled = defaultView.enabled;
  57. }
  58. }
  59. RCT_REMAP_VIEW_PROPERTY(thumbColor, thumbTintColor, UIColor);
  60. RCT_REMAP_VIEW_PROPERTY(trackColorForFalse, tintColor, UIColor);
  61. RCT_REMAP_VIEW_PROPERTY(trackColorForTrue, onTintColor, UIColor);
  62. @end