@@ -54,6 +54,10 @@ @interface BRDatePickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
54
54
@property (nonatomic , assign ) NSInteger yearWeekIndex;
55
55
@property (nonatomic , assign ) NSInteger quarterIndex;
56
56
57
+ // 记录滚动中的位置
58
+ @property (nonatomic , assign ) NSInteger rollingComponent;
59
+ @property (nonatomic , assign ) NSInteger rollingRow;
60
+
57
61
// 记录选择的值
58
62
@property (nonatomic , strong ) NSDate *mSelectDate;
59
63
@property (nonatomic , copy ) NSString *mSelectValue;
@@ -757,7 +761,7 @@ - (UIPickerView *)pickerView {
757
761
}
758
762
759
763
#pragma mark - UIPickerViewDataSource
760
- // 1.设置 pickerView 的列数
764
+ // 1.返回组件数量
761
765
- (NSInteger )numberOfComponentsInPickerView : (UIPickerView *)pickerView {
762
766
if (self.pickerMode == BRDatePickerModeYMDHMS) {
763
767
return 6 ;
@@ -791,7 +795,7 @@ - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
791
795
return 0 ;
792
796
}
793
797
794
- // 2.设置 pickerView 每列的行数
798
+ // 2.返回每个组件的行数
795
799
- (NSInteger )pickerView : (UIPickerView *)pickerView numberOfRowsInComponent : (NSInteger )component {
796
800
NSArray *rowsArr = [NSArray array ];
797
801
if (self.pickerMode == BRDatePickerModeYMDHMS) {
@@ -857,10 +861,19 @@ - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forC
857
861
858
862
// 2.设置选择器中间选中行的样式
859
863
[self .pickerStyle setupPickerSelectRowStyle: pickerView titleForRow: row forComponent: component];
864
+
865
+ // 3.记录选择器滚动过程中选中的列和行
866
+ // 获取选择器组件滚动中选中的行
867
+ NSInteger selectRow = [pickerView selectedRowInComponent: component];
868
+ if (selectRow >= 0 ) {
869
+ self.rollingComponent = component;
870
+ self.rollingRow = selectRow;
871
+ }
860
872
861
873
return label;
862
874
}
863
875
876
+ // 返回每行的标题
864
877
- (NSString *)pickerView : (UIPickerView *)pickerView titleForRow : (NSInteger )row forComponent : (NSInteger )component {
865
878
NSString *titleString = @" " ;
866
879
if (self.pickerMode == BRDatePickerModeYMDHMS) {
@@ -978,7 +991,36 @@ - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row f
978
991
return titleString;
979
992
}
980
993
981
- // 4.滚动 pickerView 执行的回调方法
994
+ // 获取选择器是否滚动中状态
995
+ - (BOOL )getRollingStatus : (UIView *)view {
996
+ if ([view isKindOfClass: [UIScrollView class ]]) {
997
+ UIScrollView *scrollView = (UIScrollView *)view;
998
+ if (scrollView.dragging || scrollView.decelerating ) {
999
+ // 如果 UIPickerView 正在拖拽或正在减速,返回YES
1000
+ return YES ;
1001
+ }
1002
+ }
1003
+
1004
+ for (UIView *subView in view.subviews ) {
1005
+ if ([self getRollingStatus: subView]) {
1006
+ return YES ;
1007
+ }
1008
+ }
1009
+
1010
+ return NO ;
1011
+ }
1012
+
1013
+ // 选择器是否正在滚动
1014
+ - (BOOL )isRolling {
1015
+ if (self.style == BRDatePickerStyleSystem) {
1016
+ return [self getRollingStatus: self .datePicker];
1017
+ } else if (self.style == BRDatePickerStyleCustom) {
1018
+ return [self getRollingStatus: self .pickerView];
1019
+ }
1020
+ return NO ;
1021
+ }
1022
+
1023
+ // 4.滚动 pickerView 完成,执行的回调方法
982
1024
- (void )pickerView : (UIPickerView *)pickerView didSelectRow : (NSInteger )row inComponent : (NSInteger )component {
983
1025
NSString *lastSelectValue = self.mSelectValue ;
984
1026
NSDate *lastSelectDate = self.mSelectDate ;
@@ -1626,8 +1668,16 @@ - (void)addPickerToView:(UIView *)view {
1626
1668
[self reloadData ];
1627
1669
1628
1670
__weak typeof (self) weakSelf = self;
1671
+ // 点击确定按钮的回调:点击确定按钮后,执行这个block回调
1629
1672
self.doneBlock = ^{
1630
- // 点击确定按钮后,执行block回调
1673
+ if (weakSelf.isRolling ) {
1674
+ NSLog (@" 选择器滚动还未结束" );
1675
+ // 问题:如果滚动选择器过快,然后在滚动过程中快速点击确定按钮,会导致 didSelectRow 代理方法还没有执行,出现没有选中的情况。
1676
+ // 解决:这里手动处理一下,如果滚动还未结束,强制执行一次 didSelectRow 代理方法,选择当前滚动的行。
1677
+ [weakSelf pickerView: weakSelf.pickerView didSelectRow: weakSelf.rollingRow inComponent: weakSelf.rollingComponent];
1678
+ }
1679
+
1680
+ // 执行选择结果回调
1631
1681
if (weakSelf.resultBlock ) {
1632
1682
weakSelf.resultBlock (weakSelf.mSelectDate , weakSelf.mSelectValue );
1633
1683
}
0 commit comments