最近做的IOS项目中,要用到好几处地方要用到选择器。比如说很常用的地区选择器(省市区),在android平台下已经实现了自定义一个Dialog。但是对IOS并不太熟悉,去网上下载了一些例子,大多是用PickerView,然后省市区分三列,如:
这样的效果也不错,只是有些时候区名太长,就看不到了,而且没有按钮可以点。还有一个就是不能自己输入地址。
衡量了一下,还是决定自己实现,最后的效果图如下:
用户可以自己输入:
看看源代码吧。
先是头文件:
//
// NerveAreaSelectorViewController.h
//
// 省市区三级选择器,可以自己输入
//
// Created by 集成显卡 on 13-5-17.
// Copyright (c) 2013年 集成显卡 zxingming@qq.com . All rights reserved.
//
#import <UIKit/UIKit.h>
typedef enum {
PROVINCE,
CITY,
AREA
} NerveSelectoreType;
//
//选择器协议,在调用的ViewController中实现此协议即可
//
@protocol NerveAreaSelectDelegate <NSObject>
@optional
- (void)onAreaSelect:(NSString *)selectValue;
- (void)onAreaCannel;
@end
@interface NerveAreaSelectorViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>{
NSArray *provinces, *cities, *areas;
NSString *province, *city, *area;
NSInteger selectType;//当前的选择类型,省,市,区
id<NerveAreaSelectDelegate> delegate;
}
@property (weak, nonatomic) IBOutlet UITextField *areaTX;
@property (weak, nonatomic) IBOutlet UITableView *areaTableView;
//
//初始化数据
//
-(id) initWithDelegate:(id<NerveAreaSelectDelegate>) targetDelegate;
//
//确定按钮点击事件
//
- (IBAction)onOkBtnClick:(id)sender;
//
//取消按钮点击事件
//
- (IBAction)okCannelBtnClick:(id)sender;
//
//隐藏键盘用的
//
- (IBAction)exitInput:(id)sender;
@end
然后是具体实现类,这里主要讲一些主要的方法。
读取数据方法:
-(id)initWithDelegate:(id<NerveAreaSelectDelegate>)targetDelegate{
delegate = targetDelegate;
[self readData];
selectType = PROVINCE;
self.navigationController.navigationBarHidden = NO;
self.title = @"ssss";
UIBarButtonItem* leftB = [[UIBarButtonItem alloc] init];
leftB.title = @"ss";
self.navigationItem.backBarButtonItem = leftB;
return self;
}
显示tableCell的方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
int index = [indexPath row];
//int section = [indexPath section];
static NSString* CustomCellIdentifier = @"NerveAreaSelectorCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if(cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CustomCellIdentifier];
}
switch (selectType) {
case PROVINCE:
cell.textLabel.text = [[provinces objectAtIndex:index]
objectForKey:@"state"];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
break;
case CITY:
cell.textLabel.text = [[cities objectAtIndex:index]
objectForKey:@"city"];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
break;
default:
cell.textLabel.text = [areas objectAtIndex:index];
cell.accessoryType = UITableViewCellAccessoryNone;
break;
}
return cell;
}
用户选择单元格时:
//表格被选择
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
int selectIndex = [indexPath row];
int cellCount = 0;
switch (selectType) {
case PROVINCE:
province = [[provinces objectAtIndex:selectIndex] objectForKey:@"state"];
cities = [[provinces objectAtIndex:selectIndex] objectForKey:@"cities"];
selectType = CITY;
cellCount = [cities count];
break;
case CITY:
city = [[cities objectAtIndex:selectIndex] objectForKey:@"city"];
areas = [[cities objectAtIndex:selectIndex] objectForKey:@"areas"];
selectType = AREA;
cellCount = [areas count];
break;
default:
area = [areas objectAtIndex:selectIndex];
break;
}
NSString* areaValue = [NSString stringWithFormat:@"%@ %@ %@",province, city,area];
NSLog(@"select=%@", areaValue);
self.areaTX.text = areaValue;
[areaTableView reloadData];
if(cellCount > 0){
NSIndexPath* topIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[areaTableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
确定按钮被点击:
- (IBAction)onOkBtnClick:(id)sender {
NSLog(@"OK click");
[delegate onAreaSelect:areaTX.text];
}
源代码下载:http://download.csdn.net/detail/ssrc0604hx/5396627