iOS使用UITableView从plist中选择省市区

版权所有,禁止匿名转载;禁止商业使用。

最近在做一个天气应用,需要用户选择所在城市。考虑到城市信息一般不会发生大的变化,所以从网上找到了中国城市信息的xml文件,下面是利用一个tableview实现地区选择的代码,比较简单,就不解释了。AddressViewController.h文件


//
//  AddressViewController.h
//  AddressDemo
//
//  Created by worthy.zhang on 15/5/29.
//  Copyright (c) 2015年 worthy.zhang. All rights reserved.
//
#import <UIKit/UIKit.h>
#define kDisplayProvince 0
#define kDisplayCity 1
#define kDisplayArea 2
@interface AddressViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>
@property(nonatomic,strong)UITableView *tableView;
@property(nonatomic,assign)int displayType;
@property(nonatomic,strong)NSArray *provinces;
@property(nonatomic,strong)NSArray *citys;
@property(nonatomic,strong)NSArray *areas;
@property(nonatomic,strong)NSString *selectedProvince;//选中的省
@property(nonatomic,strong)NSString *selectedCity;//选中的市
@property(nonatomic,strong)NSString *selectedArea;//选中的区
@end
AddressViewController.m文件
//
//  AddressViewController.m
//  AddressDemo
//
//  Created by worthy.zhang on 15/5/29.
//  Copyright (c) 2015年 worthy.zhang. All rights reserved.
//
#import "AddressViewController.h"
@interface AddressViewController ()
@property(nonatomic,strong)NSIndexPath *selectedIndexPath;//当前选中的NSIndexPath
@end
@implementation AddressViewController
-(void)viewDidLoad{
  [self configureData];
  [self configureViews];
}
-(void)configureData{
  if (self.displayType == kDisplayProvince) {
    //从文件读取地址字典
    NSString *addressPath = [[NSBundle mainBundle] pathForResource:@"address" ofType:@"plist"];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithContentsOfFile:addressPath];
    self.provinces = [dict objectForKey:@"address"];
  }
}
-(void)configureViews{
  if (self.displayType == kDisplayProvince) { //只在选择省份页面显示取消按钮
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStylePlain target:self action:@selector(cancel)];
  }
  if (self.displayType == kDisplayArea) {//只在选择区域页面显示确定按钮
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"确定" style:UIBarButtonItemStylePlain target:self action:@selector(submit)];
  }
  CGRect frame = [self.view bounds];
  self.tableView = [[UITableView alloc]initWithFrame:frame];
  self.tableView.delegate = self;
  self.tableView.dataSource = self;
  [self.view addSubview:self.tableView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  if (self.displayType == kDisplayProvince) {
    return self.provinces.count;
  }else if (self.displayType == kDisplayCity){
    return self.citys.count;
  }else{
    return self.areas.count;
  }
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString* ID = @"cityCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  if (!cell) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    if (self.displayType == kDisplayArea) {
      cell.accessoryType = UITableViewCellAccessoryNone;
    }else{
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
  }
  if (self.displayType == kDisplayProvince) {
    NSDictionary *province = self.provinces[indexPath.row];
    NSString *provinceName = [province objectForKey:@"name"];
    cell.textLabel.text= provinceName;
  }else if (self.displayType == kDisplayCity){
    NSDictionary *city = self.citys[indexPath.row];
    NSString *cityName = [city objectForKey:@"name"];
    cell.textLabel.text= cityName;
  }else{
    cell.textLabel.text= self.areas[indexPath.row];
    cell.imageView.image = [UIImage imageNamed:@"unchecked"];
  }
  return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  if (self.displayType == kDisplayProvince) {
    NSDictionary *province = self.provinces[indexPath.row];
    NSArray *citys = [province objectForKey:@"sub"];
    self.selectedProvince = [province objectForKey:@"name"];
    //构建下一级视图控制器
    AddressViewController *cityVC = [[AddressViewController alloc]init];
    cityVC.displayType = kDisplayCity;//显示模式为城市
    cityVC.citys = citys;
    cityVC.selectedProvince = self.selectedProvince;
    [self.navigationController pushViewController:cityVC animated:YES];
  }else if (self.displayType == kDisplayCity){
    NSDictionary *city = self.citys[indexPath.row];
    self.selectedCity = [city objectForKey:@"name"];
    NSArray *areas = [city objectForKey:@"sub"];
    //构建下一级视图控制器
    AddressViewController *areaVC = [[AddressViewController alloc]init];
    areaVC.displayType = kDisplayArea;//显示模式为区域
    areaVC.areas = areas;
    areaVC.selectedCity = self.selectedCity;
    areaVC.selectedProvince = self.selectedProvince;
    [self.navigationController pushViewController:areaVC animated:YES];
  }
  else{
    //取消上一次选定状态
    UITableViewCell *oldCell =  [tableView cellForRowAtIndexPath:self.selectedIndexPath];
    oldCell.imageView.image = [UIImage imageNamed:@"unchecked"];
    //勾选当前选定状态
    UITableViewCell *newCell =  [tableView cellForRowAtIndexPath:indexPath];
    newCell.imageView.image = [UIImage imageNamed:@"checked"];
    //保存
    self.selectedArea = self.areas[indexPath.row];
    self.selectedIndexPath = indexPath;
  }
}
-(void)submit{
  NSString *msg = [NSString stringWithFormat:@"%@-%@-%@",self.selectedProvince,self.selectedCity,self.selectedArea];
  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"选择地址" message:msg delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
  [alert show];
}
-(void)cancel{
  [self dismissViewControllerAnimated:YES completion:nil];
}
@end

效果图如下:

iOS开发,UITableView,省市区

RrEBjq.png

Demo地址:


https://github.com/WorthyZhang/AddressDemo

省市区plist数据下载地址:


http://download.csdn.net/detail/worthyzhang/8751317


0 0