iOS自定义日期、时间、城市选择器实例代码

2020-01-20 13:15:50丽君

(4)创建继承于WXZBasePickView的城市选择器WXZPickCityView。

.h声明相关属性和方法


#import "WXZBasePickView.h"
@class WXZPickCityView;

@protocol PickerCityViewDelegate<NSObject>

- (void)pickerArea:(WXZPickCityView *)pickerArea selectProvince:(NSString *)province selectCity:(NSString *)city;

@end
@interface WXZPickCityView : WXZBasePickView
@property(nonatomic, weak)id <PickerCityViewDelegate>delegate ;

/**设置默认的省市*/

-(void)setDefaultCity:(NSString *)defaultCity DefaultProvience:(NSString *)defaultProvience;
@end

.m实现相关方法


#import "WXZPickCityView.h"
@interface WXZPickCityView()<UIPickerViewDataSource, UIPickerViewDelegate>


@property (nonatomic, strong, nullable)NSArray *areaDataSource;

@property (nonatomic, strong, nullable)NSMutableArray *provinceArray;

@property (nonatomic, strong, nullable)NSMutableArray *cityArray;

@property (nonatomic, strong, nullable)NSMutableArray *selectedArray;//当前选中的数组

@property (nonatomic, strong, nullable)NSString *selectProvince;

@property (nonatomic, strong, nullable)NSString *selectCity;

@end

@implementation WXZPickCityView


- (void)initPickView
{
  [super initPickView];
  for (NSDictionary *dic in self.areaDataSource) {
    [self.provinceArray addObject:dic[@"state"]];
  }

  NSMutableArray *citysArr = [NSMutableArray arrayWithArray:[self.areaDataSource firstObject][@"cities"]];


  for (NSDictionary *dic in citysArr) {
    [self.cityArray addObject:dic[@"city"]];
  }

  self.selectProvince = self.provinceArray[0];
  self.selectCity = self.cityArray[0];


  [self.pickerView setDelegate:self];
  [self.pickerView setDataSource:self];

}

//设置默认显示的省市
-(void)setDefaultCity:(NSString *)defaultCity DefaultProvience:(NSString *)defaultProvience{

  for (NSInteger i = 0; i<_provinceArray.count; i++) {

    if ([_provinceArray[i] isEqualToString:defaultProvience]) {

      [self.pickerView selectRow:i inComponent:0 animated:NO];
      self.selectedArray = self.areaDataSource[i][@"cities"];

      [self.cityArray removeAllObjects];
      [self.selectedArray enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [self.cityArray addObject:obj[@"city"]];
      }];
      for (NSInteger j= 0; j<_cityArray.count; j++) {

        if ([defaultCity isEqualToString:_cityArray[j]]) {

          [self.pickerView selectRow:i inComponent:0 animated:NO];
          [self.pickerView reloadComponent:1];
          [self.pickerView selectRow:j inComponent:1 animated:NO];
          [self refreshSelectAreaData];
        }
      }
    }


  }

}


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
  return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
  if (component == 0) {
    return self.provinceArray.count;
  }else {
    return self.cityArray.count;
  }
}

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
  return 36;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
  if (component == 0) {
    self.selectedArray = self.areaDataSource[row][@"cities"];

    [self.cityArray removeAllObjects];
    [self.selectedArray enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
      [self.cityArray addObject:obj[@"city"]];
    }];


    [pickerView reloadComponent:1];
    [pickerView selectRow:0 inComponent:1 animated:YES];


  }else if (component == 1) {
    if (self.selectedArray.count == 0) {
      self.selectedArray = [self.areaDataSource firstObject][@"cities"];
    }

  }else{
  }

  [self refreshSelectAreaData];
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view
{

  for(UIView *singleLine in pickerView.subviews)
  {
    if (singleLine.frame.size.height < 1)
    {
      singleLine.backgroundColor =[UIColor grayColor];
    }
  }
  NSString *text;
  if (component == 0) {
    text = self.provinceArray[row];
  }else if (component == 1){
    text = self.cityArray[row];
  }else{

  }

  UILabel *label = [[UILabel alloc]init];
  label.textAlignment = 1;
  label.font = [UIFont systemFontOfSize:16];
  label.text = text;

  return label;
}


- (void)clickConfirmButton
{

  [self.delegate pickerArea:self selectProvince:self.selectProvince selectCity:self.selectCity];

  [super clickConfirmButton];
}


- (void)refreshSelectAreaData
{
  NSInteger provienceIndex = [self.pickerView selectedRowInComponent:0];
  NSInteger cityIndex = [self.pickerView selectedRowInComponent:1];

  self.selectProvince = self.provinceArray[provienceIndex];
  self.selectCity = self.cityArray[cityIndex];


}



- (NSArray *)areaDataSource
{
  if (!_areaDataSource) {
    NSString *path = [[NSBundle bundleForClass:[WXZPickCityView class]] pathForResource:@"area" ofType:@"plist"];
    _areaDataSource = [[NSArray alloc]initWithContentsOfFile:path];
  }
  return _areaDataSource;
}

- (NSMutableArray *)provinceArray
{
  if (!_provinceArray) {
    _provinceArray = [NSMutableArray array];
  }
  return _provinceArray;
}

- (NSMutableArray *)cityArray
{
  if (!_cityArray) {
    _cityArray = [NSMutableArray array];
  }
  return _cityArray;
}



- (NSMutableArray *)selectedArray
{
  if (!_selectedArray) {
    _selectedArray = [NSMutableArray array];
  }
  return _selectedArray;
}



@end