iOS开发-选择城市

实现思路:

  1. 首先我们需要城市数据资源,这里存到了plist文件里。
  2. 从plist里面取出城市数据,自己实现index索引列表。
  3. 代理方法传值,将列表页选中的数据传到上一页面。

plist文件格式如下图:
city

代码示范:

HYCityViewController.h文件

//  HYCityViewController.h
#import <UIKit/UIKit.h>
//代理声明
@protocol HYCityViewDelegate <NSObject>

- (void)sendCityName:(NSString *)name;

@end

@interface HYCityViewController : UIViewController

@property (nonatomic,weak)id <HYCityViewDelegate> delegate;

@end

HYCityViewController.m文件

#import "HYCityViewController.h"

#define kScreen_width [UIScreen mainScreen].bounds.size.width
#define kScreen_height [UIScreen mainScreen].bounds.size.height

@interface HYCityViewController ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic,strong) UITableView *cityTableView;

/**
 *  当前城市数据源
 */
@property (nonatomic,strong) NSMutableArray *dataSourceArr;

/**
 *  索引数据源
 */
@property (nonatomic,strong) NSMutableArray *indexSourceArr;

@end

@implementation HYCityViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    [self initNav];
    [self initDataSource];
    [self initTableView];
}

- (void)initNav
{
    UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreen_width, 64)];
    bgView.backgroundColor = [UIColor colorWithRed:241/255.0f green:241/255.0f  blue:241/255.0f  alpha:1.0f];
    [self.view addSubview:bgView];

    //取消按钮
    UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    closeBtn.frame = CGRectMake(20, 30, 20, 20);
    [closeBtn setImage:[UIImage imageNamed:@"icon_nav_quxiao_normal"] forState:UIControlStateNormal];
    [closeBtn addTarget:self action:@selector(closeBtn:) forControlEvents:UIControlEventTouchUpInside];
    [bgView addSubview:closeBtn];

    //标题
    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(kScreen_width/2-50, 30, 100, 25)];
    titleLabel.textColor = [UIColor blackColor];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.font = [UIFont systemFontOfSize:18];
    titleLabel.text = @"选择城市";
    [bgView addSubview:titleLabel];
}

-(void)initTableView
{
    self.cityTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, kScreen_width, kScreen_height - 64) style:UITableViewStylePlain];
    self.cityTableView.dataSource = self;
    self.cityTableView.delegate = self;
    self.cityTableView.sectionIndexColor = [UIColor colorWithRed:252/255.0f green:74/255.0f blue:132/255.0f alpha:1.0f];
    [self.view addSubview:self.cityTableView];
}

-(void)initDataSource
{
    self.dataSourceArr = [[NSMutableArray alloc]init];
    self.indexSourceArr = [[NSMutableArray alloc]init];

    NSString *plistPath = [[NSBundle mainBundle]pathForResource:@"city" ofType:@"plist"];
    NSMutableArray *cityArr = [[NSMutableArray alloc]initWithContentsOfFile:plistPath];
    _dataSourceArr = [self sortArray:cityArr];
}



- (NSMutableArray *)sortArray:(NSMutableArray *)originalArray
{
    NSMutableArray *array = [[NSMutableArray alloc]init];

    //根据拼音对数组排序
    NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pinyin" ascending:YES]];
    //排序
    [originalArray sortUsingDescriptors:sortDescriptors];

    NSMutableArray *tempArray = nil;
    BOOL flag = NO;

    //分组
    for (int i = 0;i < originalArray.count; i++) {
        NSString *pinyin = [originalArray[i] objectForKey:@"pinyin"];
        NSString *firstChar = [pinyin substringToIndex:1];
        if (![_indexSourceArr containsObject:[firstChar uppercaseString]]) {
            [_indexSourceArr addObject:[firstChar uppercaseString]];
            tempArray = [[NSMutableArray alloc]init];
            flag = NO;
        }
        if ([_indexSourceArr containsObject:[firstChar uppercaseString]]) {
            [tempArray addObject:originalArray[i]];
            if (flag == NO) {
                [array addObject:tempArray];
                flag = YES;
            }
        }
    }
    return array;
}

#pragma mark dataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.dataSourceArr.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [self.dataSourceArr[section] count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [_indexSourceArr objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return _indexSourceArr;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 50;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIndentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifier];
    }
    cell.textLabel.text = [[self.dataSourceArr[indexPath.section] objectAtIndex:indexPath.row] objectForKey:@"name"];
    return cell;
}

#pragma mark - UITableViewDelegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    //代理传值
    if (self.delegate != nil) {
        [self.delegate sendCityName:[[self.dataSourceArr[indexPath.section] objectAtIndex:indexPath.row] objectForKey:@"name"]];
         [self dismissViewControllerAnimated:YES completion:nil];
    }
}

- (void)closeBtn:(UIButton *)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

ViewController.m文件

#import "ViewController.h"
#import "HYCityViewController.h"
@interface ViewController ()<HYCityViewDelegate>

@property (nonatomic,strong) UIBarButtonItem *leftBtn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _leftBtn = [[UIBarButtonItem alloc]initWithTitle:@"北京" style:UIBarButtonItemStylePlain target:self action:@selector(selectCity)];
    [_leftBtn setTintColor:[UIColor colorWithRed:252/255.0f green:74/255.0f blue:132/255.0f alpha:1.0f]];
    self.navigationItem.leftBarButtonItem = _leftBtn;

}

- (void)selectCity{
    HYCityViewController *cityVC = [[HYCityViewController alloc]init];
    cityVC.delegate = self;
    [self presentViewController:cityVC animated:YES completion:nil];
}

- (void)sendCityName:(NSString *)name{
    [_leftBtn setTitle:name];
}

效果图:
xiaoguotu

代码地址:https://github.com/huanghaiyan/SelectCity-demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值