iOS-UI之UIPickerView的用法以及联动崩溃的解决办法

先看一下UIPickerView样式:

整体结构可以分为有几列columns数据,每列有多少行rows数据。如果是显示1列以上的情况,数据结构为1个数组+这个数组中有N个子数组的结构。

和Tableview一样,使用UIPickerView需要遵守该控件的代理协议:

<UIPickerViewDelegate>和<UIPickerViewDataSource>

具体方法代码如下:

#pragma mark - pickerview delegate、datasource

// returns the number of 'columns' to display.返回有多少个columns
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return self.dataArray.count;
}

// returns the # of rows in each component.在component返回有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    NSArray *arr = self.dataArray[component];
    return arr.count;
}

// 返回pickerview component中row行的显示数据
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    NSArray *arr = self.dataArray[component];
    return arr[row];
}

// pickerview选中某行时的代理事件
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

如果出现例如省份城市的相关联动需求,由于代理方法的调用顺序问题,会出现两方连动协调不一致的问题,可以通过添加一个私有模型对象来存储还未更新的前一列选择的数据。具体代码如下:

@interface ViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>
@property (nonatomic, strong) NSArray *dataArray;
@property (weak, nonatomic) IBOutlet UIPickerView *pickerview;
@property (weak, nonatomic) IBOutlet UILabel *provinceLabel;
@property (weak, nonatomic) IBOutlet UILabel *citiesLable;

@property (nonatomic, strong) ProvinceModel *model;

@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.pickerview.delegate = self;
    self.pickerview.dataSource = self;
    
    [self pickerView:self.pickerview didSelectRow:0 inComponent:0];
}

#pragma mark - UIPickerview delegate

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    if (component == 0) {
        [self.pickerview selectRow:0 inComponent:1 animated:NO];
        [self.pickerview reloadComponent:1];
        NSInteger provinceIndex = [self.pickerview selectedRowInComponent:0];
        ProvinceModel *model = self.dataArray[provinceIndex];
        self.provinceLabel.text = model.province;
    }
    NSInteger cityIndex = [self.pickerview selectedRowInComponent:1];
    self.citiesLable.text = self.model.cities[cityIndex];
}

#pragma mark - UIPickerview datasource

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    if (component == 0) {
        ProvinceModel *model = self.dataArray[row];
        return model.province;
    }else{
        return self.model.cities[row];
    }
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (component == 0) {
        return self.dataArray.count;
    }else{
        self.model = self.dataArray[[self.pickerview selectedRowInComponent:0]];
        return self.model.cities.count;
    }
}

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

#pragma mark - 懒加载数据数组

-(NSArray *)dataArray{
    if (_dataArray == nil) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"CitiData" ofType:@"plist"];
        NSArray *array = [NSArray arrayWithContentsOfFile:path];
        NSMutableArray *marr = [NSMutableArray arrayWithCapacity:array.count];
        for (NSDictionary *dictionary in array) {
            ProvinceModel *model = [ProvinceModel provinceModelWithDictionary:dictionary];
            [marr addObject:model];
        }
        _dataArray = marr;
    }
    return _dataArray;
}

@end

猜你喜欢

转载自blog.csdn.net/JustinZYP/article/details/124480931