本节书摘来自异步社区《iPad开发从入门到精通》一书中的第6章,第6.3节站站查询,作者 杨春泽,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.3 站站查询
iPad开发从入门到精通
本模块的功能是提供站站查询功能,只需输入起始站和目的站的名称,就可以快速查询到符合要求的公交线路了。在本节的内容中,将详细讲解站站查询模块的具体实现流程。
6.3.1 站站查询主视图
站站查询主视图CBus_StatToStatView.xib的UI界面如图6-6所示,在上方显示搜索表单,下方列表显示了30条线路。
实现文件CBus_StatToStatViewController.h的代码如下所示。
#import <UIKit/UIKit.h>
#define kBeginStationComponent 0
#define kEndStationComponent 1
enum EStationType{
EBeginStationType,
EEndStationType,
ENoneStationType
};
@interface CBus_StatToStatViewController : UIViewController <UITableViewDelegate,
UITableViewDataSource,
UISearchDisplayDelegate, UISearchBarDelegate, UIPickerView Delegate, UIPickerViewDataSource>{
UITableView *busStatToStatTableView;
UISearchBar *currentSearchBar;
UISearchBar *beginSearchBar;
UISearchBar *endSearchBar;
UIPickerView *stationPickView;
NSInteger currentBeginIndex;
NSInteger currentEndIndex;
NSInteger stationType;
NSMutableArray *beginFilteredListContent;
NSMutableArray *endFilteredListContent;
NSString *ifSelectedPickerString;
NSString *ifSelectedPickEndString;
BOOL isSearchBegin;
BOOL isSearchEndBegin;
BOOL isJumpToStat;
UIBarButtonItem *returnKeyBordBtn;
}
@property (nonatomic, retain) IBOutlet UITableView *busStatToStatTableView;
@property (nonatomic, retain) IBOutlet UISearchBar *beginSearchBar;
@property (nonatomic, retain) IBOutlet UISearchBar *endSearchBar;
@property (nonatomic, retain) IBOutlet UIPickerView *stationPickView;
@property(nonatomic, retain) NSMutableArray *beginFilteredListContent;
@property(nonatomic, retain) NSMutableArray *endFilteredListContent;
@property(nonatomic) BOOL isJumpToStat;
- (void)filterContentForSearchText:(NSString*)searchText;
@end
文件CBus_StatToStatViewController.m是文件CBus_StatToStatViewController.h的实现,功能是显示搜索表单,根据用户输入的起始站点和终点站信息,列表显示符合搜索条件的线路。
#import "CBus_StatToStatViewController.h"
#import "CBus_LineDetailViewController.h"
#import "CBus_StationDetailViewController.h"
#import "CDataContainer.h"
@implementation CBus_StatToStatViewController
@synthesize busStatToStatTableView,beginFilteredListContent,endFilteredListContent;
@synthesize beginSearchBar, endSearchBar, stationPickView;
@synthesize isJumpToStat;
// 界面初始化
- (void)viewDidLoad {
[super viewDidLoad];
returnKeyBordBtn = [[UIBarButtonItem alloc] initWithTitle:@"收起键盘" style:UIBarButtonItemStylePlain
target:self
action:@selector(HideKeyBoard:)];
self.navigationItem.rightBarButtonItem = nil;// 输入键盘;
self.beginFilteredListContent = [NSMutableArray arrayWithArray:[CDataContainer Instance].stationNameArray];
self.endFilteredListContent = [NSMutableArray arrayWithArray:[CDataContainer Instance].stationNameArray];
isSearchBegin = NO;
isSearchEndBegin = NO;
isJumpToStat = NO;
ifSelectedPickerString = [[NSString alloc] init];
ifSelectedPickEndString = [[NSString alloc] init];
}
#pragma mark -
#pragma mark View lifecycle
//根据设置的样式显示
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.busStatToStatTableView reloadData];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSInteger styleNum = [userDefault integerForKey:@"styleType"];
switch (styleNum){
case 0:{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyle Default;
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
self.beginSearchBar.barStyle = UIBarStyleDefault;
self.endSearchBar.barStyle = UIBarStyleDefault;
break;
}
case 1:{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyle BlackOpaque;
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
self.beginSearchBar.barStyle = UIBarStyleBlackOpaque;
self.endSearchBar.barStyle = UIBarStyleBlackOpaque;
break;
}
}
self.navigationItem.rightBarButtonItem = nil;
stationType = ENoneStationType;
[stationPickView reloadAllComponents];
if(isJumpToStat){
CBus_StationDetailViewController *detailViewController = [[CBus_Station DetailViewController alloc] initWithNibName:@"CBus_StationDetailView" bundle:nil];
detailViewController.currentStationName = [[CDataContainer
Instance].stationNameArray objectAtIndex:currentBeginIndex];
detailViewController.currentStationIndex = currentBeginIndex+1;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
isJumpToStat = NO;
}
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
beginSearchBar.text = @"";
endSearchBar.text = @"";
}
// 默认图片
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)
interfaceOrientation{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(IBAction)HideKeyBoard:(id)sender{
NSLog(@"------HideKeyBoard------");
self.navigationItem.rightBarButtonItem = nil;
beginSearchBar.text = @"";
endSearchBar.text = @"";
stationPickView.hidden = YES;
[currentSearchBar resignFirstResponder];
}
#pragma mark -
#pragma mark Table view data source
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section{
return @"站站查询";
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger) section{
return 30;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [[CDataContainer Instance].stationNameArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.selectionStyle = UITableViewCellSelectionStyleGray;
// Configure the cell
cell.textLabel.text = [[CDataContainer Instance].stationNameArray objectAtIndex: indexPath.row];
cell.imageView.image = [UIImage imageNamed:@"bus_table_stat.png"];
return cell;
}
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// 创造和推动另一个视图控制器
CBus_StationDetailViewController *detailViewController = [[CBus_StationDetail ViewController alloc] initWithNibName:@"CBus_StationDetailView" bundle:nil];
detailViewController.currentStationName = [[CDataContainer Instance].stationName Array objectAtIndex:indexPath.row];
detailViewController.currentStationIndex = indexPath.row+1;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:
(NSIndexPath *)indexPath
{
}
#pragma mark -
#pragma mark Picker view data source
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component{
if (component == kBeginStationComponent){
if ([beginSearchBar.text isEqualToString:@""]){
return [[CDataContainer Instance].stationNameArray count];
}
if (stationType == EBeginStationType){
return[beginFilteredListContent count];
}
else{
return [[CDataContainer Instance].stationNameArray count];
}
}
else if(component == kEndStationComponent){
if ([endSearchBar.text isEqualToString:@""]){
return [[CDataContainer Instance].stationNameArray count];
}
if (stationType == EEndStationType){
return[endFilteredListContent count];
}
else {
return [[CDataContainer Instance].stationNameArray count];
}
}
return 0;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component{
if (component == kBeginStationComponent){
if ([beginSearchBar.text isEqualToString:@""]){
return [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
if (stationType == EBeginStationType){
return[beginFilteredListContent objectAtIndex:row];
}
else {
return [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
}
else if(component == kEndStationComponent){
if ([endSearchBar.text isEqualToString:@""]){
return [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
if (stationType == EEndStationType){
return[endFilteredListContent objectAtIndex:row];
}
else {
return [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
}
return nil;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component{
if (component == kBeginStationComponent){
currentBeginIndex = row;
if ([beginSearchBar.text isEqualToString:@""]){
isSearchBegin = NO;
ifSelectedPickerString = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
beginSearchBar.text = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
else if (stationType == EBeginStationType){
ifSelectedPickerString = [beginFilteredListContent objectAtIndex:row];
beginSearchBar.text = [beginFilteredListContent objectAtIndex:row];
}
else {
ifSelectedPickerString = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
beginSearchBar.text = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
}
}
else if(component == kEndStationComponent){
currentEndIndex = row;
if ([endSearchBar.text isEqualToString:@""]){
isSearchEndBegin = NO;
ifSelectedPickEndString = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
endSearchBar.text = [[CDataContainer Instance].stationNameArray object AtIndex:row];
}
else if (stationType == EEndStationType){
ifSelectedPickEndString = [endFilteredListContent objectAtIndex:row];
endSearchBar.text = [endFilteredListContent objectAtIndex:row];
}
else{
ifSelectedPickEndString = [[CDataContainer Instance].stationNameArray objectAtIndex:row];
endSearchBar.text = [[CDataContainer Instance].stationNameArray object AtIndex:row];
}
}
}
#pragma mark -
#pragma mark SearchBarText delegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
NSLog(@"------searchBarTextDidBeginEditing---");
stationPickView.hidden = NO;
self.navigationItem.rightBarButtonItem = returnKeyBordBtn;
currentSearchBar = searchBar;
if (currentSearchBar == beginSearchBar){
NSLog(@"---------Type------EBeginStationType");
stationType = EBeginStationType;
}
else{
NSLog(@"---------Type------EEndStationType");
stationType = EEndStationType;
}
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
NSLog(@"------searchBarTextDidEndEditing---");
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
NSLog(@"--------SearchBar_text Changed--------");
if(searchBar == beginSearchBar)
{
if ([ifSelectedPickerString isEqualToString:searchText]){
return;
}
if (stationType == EBeginStationType){
isSearchBegin = YES;
[self filterContentForSearchText:searchText];
[stationPickView reloadAllComponents];
}
}
else if(searchBar == endSearchBar){
if ([ifSelectedPickEndString isEqualToString:searchText]){
return;
}
if (stationType == EEndStationType){
isSearchEndBegin = YES;
[self filterContentForSearchText:searchText];
[stationPickView reloadAllComponents];
}
}
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
NSLog(@"------searchBarSearchButtonClicked---");
CBus_StationDetailViewController *detailViewController = [[CBus_StationDetail ViewController alloc] initWithNibName:@"CBus_StationDetailView" bundle:nil];
if ((![beginSearchBar.text isEqualToString:@""])&&(![endSearchBar.text isEqual ToString:@""])){
NSLog(@"------站站查询------");
if (isSearchBegin){
detailViewController.beginStationName = [beginFilteredListContent
objectAtIndex:currentBeginIndex];
detailViewController.beginStationIndex = [[CDataContainer Instance]. stationNameArray indexOfObject:[beginFilteredListContent objectAtIndex:currentBeginIndex]]+1;
}
else {
detailViewController.beginStationName = [[CDataContainer Instance].
stationNameArray objectAtIndex:currentBeginIndex];
detailViewController.beginStationIndex = currentBeginIndex+1;
}
if (isSearchEndBegin){
detailViewController.endStationName = [endFilteredListContent object
AtIndex:currentEndIndex];
detailViewController.endStationIndex = [[CDataContainer Instance].
stationNameArray indexOfObject:[endFilteredListContent objectAtIndex:currentEndIndex]]+1;
}
else {
detailViewController.endStationName = [[CDataContainer Instance].
stationNameArray objectAtIndex:currentEndIndex];
detailViewController.endStationIndex = currentEndIndex+1;
}
detailViewController.isStatToStat = YES;
}
else if (stationType == EBeginStationType){
NSLog(@"------始站查询------");
if (isSearchBegin){
detailViewController.currentStationName = [beginFilteredListContent objectAtIndex:currentBeginIndex];
detailViewController.currentStationIndex = [[CDataContainer Instance].
stationNameArray indexOfObject:[beginFilteredListContent objectAtIndex:currentBeginIndex]]+1;
}
else {
detailViewController.currentStationName = [[CDataContainer Instance].
stationNameArray objectAtIndex:currentBeginIndex];
detailViewController.currentStationIndex = currentBeginIndex+1;
}
detailViewController.isStatToStat = NO;
}
else if(stationType == EEndStationType){
NSLog(@"------尾站查询------");
if (isSearchEndBegin){
detailViewController.currentStationName = [endFilteredListContent
objectAtIndex:currentEndIndex];
detailViewController.currentStationIndex = [[CDataContainer Instance].
stationNameArray indexOfObject:[endFilteredListContent objectAtIndex:currentEndIndex]]+1;
}
else{
detailViewController.currentStationName = [[CDataContainer Instance]. stationNameArray objectAtIndex:currentEndIndex];
detailViewController.currentStationIndex = currentEndIndex+1;
}
detailViewController.isStatToStat = NO;
}
[currentSearchBar resignFirstResponder];
stationPickView.hidden = YES;
// 通过选定的对象到新视图控制器
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
#pragma mark -
#pragma mark Search Methods
- (void)filterContentForSearchText:(NSString*)searchText;{
//基于搜索文本和范围更新过滤阵列
//首先清除过滤数组
if (stationType == EBeginStationType){
[self.beginFilteredListContent removeAllObjects];
for (int i = 0; i < [[CDataContainer Instance].stationNameArray count]; i++){
NSString *searchNameInfo = [[CDataContainer Instance].stationNameArray objectAtIndex:i];
NSString *searchPYInfo = [[CDataContainer Instance].stationPYArray objectAtIndex:i];
NSComparisonResult result = [searchNameInfo compare:searchText options: (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
NSComparisonResult resultPY = [searchPYInfo compare:searchText options: (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame || resultPY == NSOrderedSame){
[self.beginFilteredListContent addObject:searchNameInfo];
}
}
}
else if(stationType == EEndStationType){
[self.endFilteredListContent removeAllObjects];
for (int i = 0; i < [[CDataContainer Instance].stationNameArray count]; i++){
NSString *searchNameInfo = [[CDataContainer Instance].stationNameArray objectAtIndex:i];
NSString *searchPYInfo = [[CDataContainer Instance].stationPYArray objectAtIndex:i];
NSComparisonResult result = [searchNameInfo compare:searchText options: (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
NSComparisonResult resultPY = [searchPYInfo compare:searchText options: (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame || resultPY == NSOrderedSame){
[self.endFilteredListContent addObject:searchNameInfo];
}
}
}
}
- (void)dealloc {
[busStatToStatTableView release];
[beginSearchBar release];
[endSearchBar release];
[currentSearchBar release];
[stationPickView release];
[beginFilteredListContent release];
[endFilteredListContent release];
[returnKeyBordBtn release];
[super dealloc];
}
@end
执行效果如图6-7所示。
6.3.2 站站查询详情视图
站站查询详情视图CBus_StatDetailStatView.xib的UI界面如图6-8所示,在上方显示票价、始发站、终点站、首班车时间和末班车时间,在下方列表显示了30条线路。
其实本模块和上一节中的线路详情模块类似,实现文件CBus_StatDetailStatViewController.m的主要代码如下所示。
#import "CBus_StatDetailStatViewController.h"
#import "CBus_StationDetailViewController.h"
#import "CBus_LineDetailLineViewController.h"
#import "CDataContainer.h"
@implementation CBus_StatDetailStatViewController
@synthesize busLineDetailTableView,currentLineName;
@synthesize currentLineIndex;
@synthesize isStatToStat;
// 视图初始化
- (void)viewDidLoad{
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBar ButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddLineToFavorite)];
[[CDataContainer Instance] GetLineStationFromTableSequence:currentLineIndex];
}
#pragma mark -
#pragma mark View lifecycle
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.busLineDetailTableView reloadData];
NSLog(@"-----Nav----%@",self.navigationController.viewControllers);
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSInteger styleNum = [userDefault integerForKey:@"styleType"];
switch (styleNum) {
case 0:{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
self.searchDisplayController.searchBar.barStyle = UIBarStyleDefault;
break;
}
case 1:{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyle BlackOpaque;
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
self.searchDisplayController.searchBar.barStyle = UIBarStyleBlackOpaque;
break;
}
}
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
isStatToStat = NO;
}
-(void)AddLineToFavorite{
NSLog(@"-------addLineToFavorite---------%@---%d",currentLineName,currentLineIndex);
for(NSString *lineName in [CDataContainer Instance].favoriteLineNameArray){
if ([lineName isEqualToString:currentLineName]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"收藏"
message:[NSString stringWithFormat:@"%@ 已收藏",currentLineName]
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
return;
}
}
[[CDataContainer Instance] InsertFavoriteInfoToDatabase:0 AddName:currentLine
Name AddIndex:currentLineIndex AddNameEnd:nil AddIndexEnd:0];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"收藏"
message:[NSString stringWithFormat:@"收藏 %@ 成功",currentLineName]
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
}
#pragma mark -
#pragma mark Table view data source
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return currentLineName;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 30;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section
return [[CDataContainer Instance].sequenceNumArray count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.selectionStyle = UITableViewCellSelectionStyleGray;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// Configure the cell
cell.textLabel.text = [[CDataContainer Instance].stationNameArray objectAtIndex: [[CDataContainer Instance] GetBusLineSequenceByIndex:indexPath.row]-1];
cell.imageView.image = [UIImage imageNamed:@"bus_table_stat.png"];
return cell;
}
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// Navigation logic may go here. Create and push another view controller
if (isStatToStat) {
return;
}
CBus_StationDetailViewController *statDetailViewController = [self.navigation
Controller.viewControllers objectAtIndex:1];
statDetailViewController.currentStationName = [[CDataContainer Instance].station NameArray objectAtIndex:[[CDataContainer Instance] GetBusLineSequenceByIndex:indexPath.row]-1];
statDetailViewController.currentStationIndex = [[CDataContainer Instance].station NameArray indexOfObject:statDetailViewController.currentStationName]+1;
[self.navigationController popViewControllerAnimated:YES];
}