iOS开发-选择城市

作者: huanghy | 来源:发表于2016-09-30 16:16 被阅读3968次

    实现思路:

    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

    相关文章

      网友评论

        本文标题:iOS开发-选择城市

        本文链接:https://www.haomeiwen.com/subject/rztryttx.html