Skip to content

Commit 06c2d95

Browse files
committed
update API for selectedSegmentIndex
1 parent 67a91e0 commit 06c2d95

File tree

6 files changed

+50
-37
lines changed

6 files changed

+50
-37
lines changed

Examples/UIExplorer/SegmentedControlIOSExample.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ var PreSelectedSegmentedControlExample = React.createClass({
4343
return (
4444
<View>
4545
<View>
46-
<SegmentedControlIOS values={["One", "Two"]} selectedValue="One" />
46+
<SegmentedControlIOS values={["One", "Two"]} selectedSegmentIndex={0} />
4747
</View>
4848
</View>
4949
);
@@ -67,7 +67,7 @@ var DisabledSegmentedControlExample = React.createClass({
6767
return (
6868
<View>
6969
<View>
70-
<SegmentedControlIOS disabled={true} values={["One", "Two"]} selectedValue="Two" />
70+
<SegmentedControlIOS disabled={true} values={["One", "Two"]} selectedSegmentIndex={1} />
7171
</View>
7272
</View>
7373
);
@@ -79,10 +79,10 @@ var ColorSegmentedControlExample = React.createClass({
7979
return (
8080
<View>
8181
<View style={{marginBottom: 10}}>
82-
<SegmentedControlIOS tintColor="#ff0000" values={["One", "Two", "Three", "Four"]} selectedValue={"One"} />
82+
<SegmentedControlIOS tintColor="#ff0000" values={["One", "Two", "Three", "Four"]} selectedSegmentIndex={0} />
8383
</View>
8484
<View>
85-
<SegmentedControlIOS tintColor="#00ff00" values={["One", "Two", "Three"]} selectedValue={"Two"} />
85+
<SegmentedControlIOS tintColor="#00ff00" values={["One", "Two", "Three"]} selectedSegmentIndex={1} />
8686
</View>
8787
</View>
8888
);
@@ -92,20 +92,40 @@ var ColorSegmentedControlExample = React.createClass({
9292
var EventSegmentedControlExample = React.createClass({
9393
getInitialState() {
9494
return {
95-
value: 'Not selected'
95+
values: ["One", "Two", "Three"],
96+
value: 'Not selected',
97+
selectedSegmentIndex: undefined
9698
};
9799
},
100+
98101
render() {
99102
return (
100103
<View>
101104
<Text style={styles.text} >
102-
{this.state.value}
105+
Value: {this.state.value}
106+
</Text>
107+
<Text style={styles.text} >
108+
Index: {this.state.selectedSegmentIndex}
103109
</Text>
104110
<SegmentedControlIOS
105-
values={["One", "Two", "Three"]}
106-
onValueChange={(value) => this.setState({value: value})} />
111+
values={this.state.values}
112+
selectedSegmentIndex={this.state.selectedSegmentIndex}
113+
onChange={this._onChange}
114+
onValueChange={this._onValueChange} />
107115
</View>
108116
);
117+
},
118+
119+
_onChange(event) {
120+
this.setState({
121+
selectedSegmentIndex: event.nativeEvent.selectedSegmentIndex,
122+
});
123+
},
124+
125+
_onValueChange(value) {
126+
this.setState({
127+
value: value,
128+
});
109129
}
110130
});
111131

IntegrationTests/SegmentedControlIOSSnapshotTest.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,19 @@ var SegmentedControlIOSSnapshotTest = React.createClass({
3636
<SegmentedControlIOS values={["One", "Two"]} />
3737
</View>
3838
<View style={styles.testRow}>
39-
<SegmentedControlIOS values={["One", "Two"]} selectedValue="One" />
39+
<SegmentedControlIOS values={["One", "Two"]} selectedSegmentIndex={0} />
4040
</View>
4141
<View style={styles.testRow}>
4242
<SegmentedControlIOS values={["One", "Two", "Three", "Four", "Five"]} />
4343
</View>
4444
<View style={styles.testRow}>
45-
<SegmentedControlIOS disabled={true} values={["One", "Two"]} selectedValue="Two" />
45+
<SegmentedControlIOS disabled={true} values={["One", "Two"]} selectedSegmentIndex={1} />
4646
</View>
4747
<View style={styles.testRow}>
48-
<SegmentedControlIOS tintColor="#ff0000" values={["One", "Two", "Three", "Four"]} selectedValue={"One"} />
48+
<SegmentedControlIOS tintColor="#ff0000" values={["One", "Two", "Three", "Four"]} selectedSegmentIndex={0} />
4949
</View>
5050
<View style={styles.testRow}>
51-
<SegmentedControlIOS tintColor="#00ff00" values={["One", "Two", "Three"]} selectedValue={"Two"} />
51+
<SegmentedControlIOS tintColor="#00ff00" values={["One", "Two", "Three"]} selectedSegmentIndex={1} />
5252
</View>
5353
</View>
5454
);

Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ var SegmentedControlIOS = React.createClass({
4646
values: PropTypes.arrayOf(PropTypes.string),
4747

4848
/**
49-
* The segmented to be pre-selected; if not in `props.values`, then
50-
* has no effect.
49+
* The index in `props.values` of the segment to be pre-selected
5150
*/
52-
selectedValue: PropTypes.string,
51+
selectedSegmentIndex: PropTypes.number,
5352

5453
/**
5554
* Used to style and layout the `SegmentedControl`. See `StyleSheet.js` and
@@ -100,16 +99,16 @@ var SegmentedControlIOS = React.createClass({
10099
},
101100

102101
render: function() {
103-
var valuesAndSelectedValue = {
104-
selectedValue: this.props.selectedValue,
102+
var valuesAndSelectedSegmentIndex = {
103+
selectedSegmentIndex: this.props.selectedSegmentIndex,
105104
values: this.props.values
106-
}
105+
};
107106
return (
108107
<RCTSegmentedControl
109108
ref={SEGMENTED_CONTROL_REFERENCE}
110109
style={[styles.segmentedControl, this.props.style]}
111110
enabled={!this.props.disabled}
112-
valuesAndSelectedValue={valuesAndSelectedValue}
111+
valuesAndSelectedSegmentIndex={valuesAndSelectedSegmentIndex}
113112
tintColor={this.props.tintColor}
114113
onChange={this._onChange}
115114
momentary={this.props.momentary}
@@ -131,8 +130,8 @@ var rkSegmentedControlAttributes = merge(ReactIOSViewAttributes.UIView, {
131130
momentary: true,
132131
enabled: true,
133132
// Send both values simultaneously, to avoid race condition where
134-
// `selectedValue` is set before `values`
135-
valuesAndSelectedValue: true
133+
// `selectedSegmentIndex` is set before `values`
134+
valuesAndSelectedSegmentIndex: true
136135
});
137136

138137

React/Views/RCTSegmentedControl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414

1515
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher NS_DESIGNATED_INITIALIZER;
1616

17-
- (void)setValuesAndSelectedValue:(NSDictionary *)valuesAndSelectedValue;
17+
- (void)setValuesAndSelectedSegmentIndex:(NSDictionary *)valuesAndSelectedValue;
1818

1919
@end

React/Views/RCTSegmentedControl.m

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,36 +25,30 @@ - (id)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher
2525
}
2626

2727

28-
- (void)setValuesAndSelectedValue:(NSDictionary *)valuesAndSelectedValue
28+
- (void)setValuesAndSelectedSegmentIndex:(NSDictionary *)valuesAndSelectedSegmentIndex
2929
{
3030
[self removeAllSegments];
3131

32-
NSArray *values = valuesAndSelectedValue[@"values"];
32+
NSArray *values = valuesAndSelectedSegmentIndex[@"values"];
33+
NSNumber *selectedSegmentIndex = valuesAndSelectedSegmentIndex[@"selectedSegmentIndex"];
34+
3335
NSUInteger insertAtIndex = 0;
3436
for (NSString *value in values) {
3537
[self insertSegmentWithTitle:value atIndex:insertAtIndex animated:NO];
3638
insertAtIndex += 1;
3739
}
3840

39-
NSString *selectedValue = valuesAndSelectedValue[@"selectedValue"];
40-
NSUInteger selectedSegmentIndex = NSNotFound;
41-
for (NSUInteger i = 0; i < self.numberOfSegments; i++) {
42-
NSString *segmentValue = [self titleForSegmentAtIndex:i];
43-
if ([segmentValue isEqualToString:selectedValue]) {
44-
selectedSegmentIndex = i;
45-
break;
46-
}
47-
}
48-
if (selectedSegmentIndex != NSNotFound) {
49-
[self setSelectedSegmentIndex:selectedSegmentIndex];
41+
if (selectedSegmentIndex) {
42+
[self setSelectedSegmentIndex:[selectedSegmentIndex integerValue]];
5043
}
5144
}
5245

5346
- (void)onChange:(UISegmentedControl *)sender
5447
{
5548
NSDictionary *event = @{
5649
@"target": self.reactTag,
57-
@"value": [self titleForSegmentAtIndex:sender.selectedSegmentIndex]
50+
@"value": [self titleForSegmentAtIndex:sender.selectedSegmentIndex],
51+
@"selectedSegmentIndex": @(sender.selectedSegmentIndex)
5852
};
5953
[_eventDispatcher sendInputEventWithName:@"topChange" body:event];
6054
}

React/Views/RCTSegmentedControlManager.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ - (UIView *)view
2020
return [[RCTSegmentedControl alloc] initWithEventDispatcher:self.bridge.eventDispatcher];
2121
}
2222

23-
RCT_EXPORT_VIEW_PROPERTY(valuesAndSelectedValue, NSDictionary);
23+
RCT_EXPORT_VIEW_PROPERTY(valuesAndSelectedSegmentIndex, NSDictionary);
2424
RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor);
2525
RCT_EXPORT_VIEW_PROPERTY(momentary, BOOL);
2626
RCT_EXPORT_VIEW_PROPERTY(enabled, BOOL);

0 commit comments

Comments
 (0)