欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

UIPickerView城市選擇 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

UIPickerView城市選擇

發(fā)表時間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):58

我應用UIPickerView寫了一個城市選擇器,可是我發(fā)明在省份滾輪滾動的時刻如不雅同時再滾動城市滾輪會崩潰,代碼如下:

@interface GLViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, strong) NSArray *provinces;

@property (nonatomic, weak) UIPickerView *pickerView;

@end

@implementation GLViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	
    // 1.創(chuàng)建pickerview
    // pickerview有默認的frame
    UIPickerView *pickerView = [[UIPickerView alloc] init];
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [self.view addSubview:pickerView];
    self.pickerView = pickerView;
}

#pragma mark - UIPickerViewDataSource
// 告訴體系有若干列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}
// 告訴體系有若干行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (0 == component) {
        // 省份列
        return self.provinces.count;
    }else
    {
        // 城市列
        // 獲取第0列選中的行
        NSInteger selectIndex = [self.pickerView selectedRowInComponent:0];
        // 1.根據(jù)第0列選中的行數(shù)獲取對應的省
        NJProvince *province = self.provinces[selectIndex];
        // 2.獲取對應省份對應的城市
        NSArray *cities = province.cities;
        // 3.返回城市的個數(shù)r
        return cities.count;
    }
}
#pragma mark - UIPickerViewDelegate
// 告訴體系每一行顯示什么內容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSLog(@"titleForRow");
    
    if (0 == component) {
         // 省份
        // 1.獲取對應行對應的省份模型
        NJProvince *province = self.provinces[row];
        // 2.返回省份的名稱
        return province.name;
    }else
    {
         // 城市列
        // 0.獲取第0列選中的行數(shù)
        NSInteger selectIndex = [pickerView selectedRowInComponent:0];
        // 1.獲取對應的省份
        NJProvince *province = self.provinces[selectIndex];
        // 2.獲取對應的城市
        return province.cities[row];
    }
}

// 監(jiān)聽pickerView的選中
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // 斷定是否修改了第0列(省份列)
    if (0 == component) {
        // 刷新第1列對應的數(shù)據(jù)
        [pickerView reloadComponent:1];
        // 讓第1列滾動到第0行
        [pickerView selectRow:0 inComponent:1 animated:YES];
    }
}

#pragma mark - 懶加載
- (NSArray *)provinces
{
    if (_provinces == nil) {
        //        加載資本
        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]];
        //        轉換為模型
        NSMutableArray *models = [NSMutableArray arrayWithCapacity:array.count];
        for (NSDictionary *dict in array) {
            NJProvince *province = [NJProvince provinceWithDictionary:dict];
            [models addObject:province];
        }
        _provinces = [models copy];
    }
    return _provinces;
}
@end
這個崩潰現(xiàn)象是因為省份滾輪在滾動過程中[pickerView selectedRowInComponent]一向在變更,而代勞辦法-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component只有在滾輪停止?jié)L動式才會調用,所以在滾動城市取數(shù)據(jù)過程中出現(xiàn)的數(shù)組越界,于是我用了另一種寫法:
@interface TCityPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, weak) UIPickerView *pickerView;
@property (nonatomic, strong) NSArray *citiesArray;
@property (nonatomic, assign) NSInteger provinceIndex;
@end

@implementation TCityPickerView

#pragma mark - public
+ (instancetype)cityPickerView {
    TCityPickerView *pickerView = [[TCityPickerView alloc] init];
    pickerView.backgroundColor = kColorBarBg;
    pickerView.show = NO;
    pickerView.frame = CGRectMake(0, kScreenHeight - 64, kScreenWidth, 244);
    [pickerView hiddenPickerView];
    return pickerView;
}


#pragma mark - lazy
- (NSArray *)citysArray {
    if (!_citiesArray) {
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil];
        _citiesArray = [NSArray arrayWithContentsOfFile:filePath];
    }
    return _citiesArray;
}    

#pragma mark - init
- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        
        self.provinceIndex = 0;
        [self initSubViews];
    }
    return self;
}

- (void)initSubViews {    
    UIPickerView *picker = [[UIPickerView alloc] init];
    picker.dataSource = self;
    picker.delegate = self;
    [self addSubview:picker];
    self.pickerView = picker;
    }

#pragma mark - UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == 0) {
        return self.citysArray.count;
    } else {
        return [self.citysArray[self.provinceIndex][@"cities"] count];
    }
}

#pragma mark - UIPickerViewDelegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *title = nil;
    if (component == 0) {
        title = self.citysArray[row][@"name"];
    } else {
        title = self.citysArray[self.provinceIndex][@"cities"][row];
    }
    return title;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

    if (component == 0) {
        self.provinceIndex = [pickerView selectedRowInComponent:0];
        [self.pickerView reloadComponent:1];
        [self.pickerView selectRow:0 inComponent:1 animated:YES];
    }

}

@end




相關案例查看更多