本地搜索功能以及整理数据按照日期来分组
#import <UIKit/UIKit.h>
@interface SearchResultTableView : UITableViewController
< UIAlertViewDelegate , UISearchDisplayDelegate , UISearchBarDelegate >
{
//讲之前CheckAndModifyView查询后的结果存到这两个数组中
NSArray* searchResultArray;
NSArray* sizeArray;
//------------------改变风格用字典存储,并且以日期来分类--------------------//
//用于存储日期
NSMutableArray* dateMutableArray_;
//用于存储searchResultArray里的数组,没有改变过的数组,只是按日期来分组
NSMutableArray* originalMutableArray_;
//存储全部已经分组的数组
NSMutableArray* allOriginalMutableArray_;
//用于存储原始数据的字典
NSMutableDictionary* originalMutableDictionary_;
//用于存储将原始数据整理后的可变数组
NSMutableArray* arrangeMutableArray_;
//存储全部已经分组的数组
NSMutableArray* allArrangeMutableArray_;
//用于存储整理后数据的字典
NSMutableDictionary* arrangeMutableDictionary_;
//------------------------------------------------------------------//
//************增加本地查找功能************//
UISearchDisplayController* searchDisplayController_;
//查询后原始数据放到数组中
NSMutableArray* resultOriginalMutableArray_;
//查询后整理过的数据放到数组中
NSMutableArray* resultArrangeMutableArray_;
NSMutableArray* resultDatesMutableArray_;
NSMutableDictionary* resultOriginalMutableDictionary_;
NSMutableDictionary* resultArrangeMutableDictionary_;
//未审核的
NSMutableArray* unauditedResultMutableArray_;
//************************************//
//公共方法中用到的
NSMutableArray* datesMutableArray_;
NSMutableArray* publicAllOriginalMutableArray_;
NSMutableArray* publicAllArrangeMutableArray_;
//=====分开两个数组 “全部” 与 “未审核” 数组,一开始就初始化,之后都不会改变的数组=========//
//全部数组
// NSMutableArray* unchangingAllDatesMutableArray_;
NSMutableDictionary* unchangingAllOriginalMutableDictionary_;
NSMutableDictionary* unchangingAllArrangeMutableDictionary_;
//未审核数组
// NSMutableArray* unauditedDatesMutableArray_;
NSMutableDictionary* unauditedOriginalMutableDictionary_;
NSMutableDictionary* unauditedArrangeMutableDictionary_;
//==========================================================================//
}
//讲之前CheckAndModifyView查询后的结果存到这两个数组中
@property ( nonatomic , retain ) NSArray* searchResultArray;
@property ( nonatomic , retain ) NSArray* sizeArray;
@end
#import "SearchResultTableView.h"
@implementation SearchResultTableView
//讲之前CheckAndModifyView查询后的结果存到这两个数组中
@synthesize searchResultArray;
@synthesize sizeArray;
#pragma mark The method of collating data //整理数据的方法
- (void)soutOutArray:(NSArray*)searchResultArray_
{
//--------------------------------------//
//这样做的原因是避免下次再用时不会再用同一块内存
//释放内存
[ originalMutableArray_ release ];
//重新分配内存
originalMutableArray_ = [ [ NSMutableArray alloc ] init ];
//释放内存
[ arrangeMutableArray_ release ];
//重新分配内存
arrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
//先清除所有数组中的元素
[ datesMutableArray_ removeAllObjects ];
[ originalMutableArray_ removeAllObjects ];
[ arrangeMutableArray_ removeAllObjects ];
[ publicAllArrangeMutableArray_ removeAllObjects ];
[ publicAllOriginalMutableArray_ removeAllObjects ];
NSLog( @"searchResultArray_:%@" , searchResultArray_ );
//新建内部用的2个字典,和一个日期数组
datesMutableArray_ = [ [ NSMutableArray alloc ] init ];
//通过这个函数来整理数据
for ( NSArray* originalArray in searchResultArray_ )
{
//#################\3\ 整理数据 #################################//
NSString* messageString = [ NSString stringWithFormat: @"%@ 第%@周-%@节,%@" , [ originalArray objectAtIndex: 4 ] , [ originalArray objectAtIndex: 2 ] , [ originalArray objectAtIndex: 5 ] , [ originalArray objectAtIndex: 6 ] ];
// NSLog( @"%@" , messageString );
//#############################################################//
//=======================\1\首先解决日期数组=================================//
//打印原始数组
NSLog( @"原始数据%@" , originalArray );
//读取每个数组中的日期
NSString* dateLongString = [ NSString stringWithFormat: @"%@" , [ originalArray objectAtIndex: 1 ] ];
NSString* dateShortString = [ dateLongString substringToIndex: 10 ];
// NSLog( @"dateShortString %@" , dateShortString );
//当datesMutableArray_数组为空的时候添加第一个日期
if ( ![ datesMutableArray_ count ] )
{
[ datesMutableArray_ addObject: dateShortString ];
}
// NSLog( @"%d" , [ datesMutableArray_ count ] );
// NSLog( @"%@" , datesMutableArray_ );
//新建数组存储旧的数组
NSArray* newDatesArray = [ [ [ NSArray alloc ] initWithArray: [ NSArray arrayWithObject: datesMutableArray_ ] ] autorelease ];
// NSLog( @"newDatesArray %@" , newDatesArray );
// NSLog( @"%@" , [ newDatesArray objectAtIndex: 0 ] );
//用于标记是否找到
BOOL foundOutBool = NO;
//逐个逐个来查看
NSInteger numberOfDate = 0;
for ( NSString* date in [ newDatesArray objectAtIndex: 0 ] )
{
numberOfDate ++;
// NSLog( @"时间%@" , date );
if ( [ date isEqualToString: dateShortString ] )
{
foundOutBool = YES;
//当找到相同日期的数组就将该数组放进同一个数组
//******有可能会存在找到的日期不是最后一个日期
if ( numberOfDate == [ [ newDatesArray objectAtIndex: 0 ] count ] )
{
//******\2\整理原始数组*******//
[ originalMutableArray_ addObject: originalArray ];
//**********************//
//#########\3\ 整理数据 ##########//
//将整理好的数据,类似于originalMutableArray_ 来导入
[ arrangeMutableArray_ addObject: messageString ];
//##############################//
}
else//******当找到的不是最后的日期则添加到字典里的对应的数组中
{
[ [ publicAllOriginalMutableArray_ objectAtIndex: numberOfDate - 1 ] addObject: originalArray ];
[ [ publicAllArrangeMutableArray_ objectAtIndex: numberOfDate - 1 ] addObject: messageString ];
}
}
}
//****** \1\ \2\ ***************//
//判断条件系 1)该日期数组没有 2)日期数组没有而且是最后一个
if ( !foundOutBool )
{
numberOfDate = 0;
//******\1\*******//
[ datesMutableArray_ addObject: dateShortString ];
//******\2\整理原始数组*******//
[ publicAllOriginalMutableArray_ addObject: [ [ NSArray arrayWithObject: originalMutableArray_ ] objectAtIndex: 0 ] ];
// NSLog( @"** %@" , );
//释放内存
[ originalMutableArray_ release ];
//重新分配内存
originalMutableArray_ = [ [ NSMutableArray alloc ] init ];
// NSLog( @"分组%@" , );
[ originalMutableArray_ addObject: originalArray ];
//******\2\整理原始数组*******//
//#########\3\ 整理数据 ##########//
[ publicAllArrangeMutableArray_ addObject: [ [ NSArray arrayWithObject: arrangeMutableArray_ ] objectAtIndex: 0 ] ];
//释放内存
[ arrangeMutableArray_ release ];
//重新分配内存
arrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
[ arrangeMutableArray_ addObject: messageString ];
//##############################//
//当这个数组是最后一个的时候,将它添加到两个数组中
if ( [ originalArray isEqualToArray: [ searchResultArray_ objectAtIndex: [ searchResultArray_ count ] - 1 ] ] )
{
[ publicAllOriginalMutableArray_ addObject: [ [ NSArray arrayWithObject: originalMutableArray_ ] objectAtIndex: 0 ] ];
[ publicAllArrangeMutableArray_ addObject: [ [ NSArray arrayWithObject: arrangeMutableArray_ ] objectAtIndex: 0 ] ];
// NSLog( @"*** %@" , );
}
}
//如果日期数组有,而且是最后一个
if ( foundOutBool && [ originalArray isEqualToArray: [ searchResultArray_ objectAtIndex: [ searchResultArray_ count ] - 1 ] ] )
{
// NSLog( @"1**** %@" , );
[ publicAllOriginalMutableArray_ addObject: [ [ NSArray arrayWithObject: originalMutableArray_ ] objectAtIndex: 0 ] ];
[ publicAllArrangeMutableArray_ addObject: [ [ NSArray arrayWithObject: arrangeMutableArray_ ] objectAtIndex: 0 ] ];
// NSLog( @"2**** %@" , );
NSLog( @"public %@" , publicAllArrangeMutableArray_ );
}
//======================================================================//
}
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
//整理返回的结果
sumMutableArray_ = [ [ NSMutableArray alloc ] init ];
//------------------改变风格用字典存储,并且以日期来分类--------------------//
//用于存储日期
dateMutableArray_ = [ [ NSMutableArray alloc ] init ];
//用于存储searchResultArray里的数组,没有改变过的数组,只是按日期来分组
originalMutableArray_ = [ [ NSMutableArray alloc ] init ];
//存储全部已经分组的数组
allOriginalMutableArray_ = [ [ NSMutableArray alloc ] init ];
//用于存储将原始数据整理后的可变数组
arrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
//存储全部已经分组的数组
allArrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
//------------------------------------------------------------------//
//公共方法中用到的
datesMutableArray_ = [ [ NSMutableArray alloc ] init ];
publicAllOriginalMutableArray_ = [ [ NSMutableArray alloc ] init ];
publicAllArrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
//=====分开两个数组 “全部” 与 “未审核” 数组,一开始就初始化,之后都不会改变的数组=========//
//全部数组
// unchangingAllDatesMutableArray_ = [ [ NSMutableArray alloc ] init ];
//未审核数组
// unauditedDatesMutableArray_ = [ [ NSMutableArray alloc ] init ];
//==========================================================================//
//----------------------- 本地查询后结果 ------------------------------------------//
//查询后原始数据放到数组中
resultOriginalMutableArray_ = [ [ NSMutableArray alloc ] init ];
//查询后整理过的数据放到数组中
resultArrangeMutableArray_ = [ [ NSMutableArray alloc ] init ];
//result日期数组
resultDatesMutableArray_ = [ [ NSMutableArray alloc ] init ];
//将为审核的都整理出来
unauditedResultMutableArray_ = [ [ NSMutableArray alloc ] init ];
//-----------------------------------------------------------------------------//
//############################## 未审核数组 #######################################//
for ( NSArray* originalArray in searchResultArray )
{
// NSLog( @"%@" , originalArray );
// NSLog( @"%@" , [ originalArray objectAtIndex: 7 ] );
if ( ![ [ originalArray objectAtIndex: 7 ] integerValue ] )
{
[ unauditedResultMutableArray_ addObject: originalArray ];
// NSLog( @"未审核%@" , unauditedResultMutableArray_ );
}
}
//通过这个函数来整理数据
[ self soutOutArray: unauditedResultMutableArray_ ];
//整理出两个字典
//未审核数组
NSMutableArray* unauditedDatesMutableArray = [ [ [ NSMutableArray alloc ] initWithArray: datesMutableArray_ ] autorelease ];
NSMutableArray* unauditedOriginalMutableArray = [ [ [ NSMutableArray alloc ] initWithArray: publicAllOriginalMutableArray_ ] autorelease ];
NSMutableArray* unauditedArrangeMutableArray = [ [ [ NSMutableArray alloc ] initWithArray: publicAllArrangeMutableArray_ ] autorelease ];
unauditedOriginalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: unauditedOriginalMutableArray forKeys: [ [ NSArray arrayWithObject: unauditedDatesMutableArray ] objectAtIndex: 0 ] ];
unauditedArrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: unauditedArrangeMutableArray forKeys: [ [ NSArray arrayWithObject: unauditedDatesMutableArray ] objectAtIndex: 0 ] ];
// NSLog( @"unauditedArrangeMutableArray_ %@" , unauditedArrangeMutableArray_ );
NSLog( @"unauditedArrangeMutableDictionary_ %@" , unauditedArrangeMutableDictionary_ );
//###############################################################################//
//------------------------- 全部数组 --------------------------------------------//
//通过这个函数来整理数据
[ self soutOutArray: searchResultArray ];
//整理出两个字典
//全部数组
//对应tableview 中的接口 3个数组 2个字典
dateMutableArray_ = datesMutableArray_ ;
allOriginalMutableArray_ = publicAllOriginalMutableArray_ ;
allArrangeMutableArray_ = publicAllArrangeMutableArray_ ;
unchangingAllOriginalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: allOriginalMutableArray_ forKeys: [ [ NSArray arrayWithObject: dateMutableArray_ ] objectAtIndex: 0 ] ];
unchangingAllArrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: allArrangeMutableArray_ forKeys: [ [ NSArray arrayWithObject: dateMutableArray_ ] objectAtIndex: 0 ] ];
originalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unchangingAllOriginalMutableDictionary_ ];
arrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unchangingAllArrangeMutableDictionary_ ];
[ self.tableView reloadData ];
NSLog( @"unauditedArrangeMutableDictionary_ %@" , unauditedArrangeMutableDictionary_ );
//-------------------------------------------------------------------------------//
//******************************************//
//************增加本地查找功能****************//
//======================================================================================//
UISearchBar* searchBar = [ [ UISearchBar alloc ] init ];
searchBar.frame =
CGRectMake( 0, 0, self.tableView.bounds.size.width , 0 );
searchBar.delegate = self;
[ searchBar sizeToFit ];
self.tableView.tableHeaderView = searchBar;
searchBar.keyboardType = UIKeyboardTypeNumberPad;
searchBar.showsCancelButton = YES;
searchDisplayController_ = [ [ UISearchDisplayController alloc ]
initWithSearchBar: searchBar
contentsController: self ];
searchDisplayController_.delegate = self;
searchDisplayController_.searchResultsDataSource = self;
searchDisplayController_.searchResultsDelegate = self;
//--------------------------------------------------------------------------------
searchBar.scopeButtonTitles =
[ NSArray arrayWithObjects:@"全部", @"未审核" , nil ];
searchBar.showsScopeBar = YES;
//--------------------------------------------------------------------------------
// NSLog( @"2 unchangingAllArrangeMutableDictionary_ %@" , unchangingAllArrangeMutableDictionary_ );
// NSLog( @"2 unauditedArrangeMutableDictionary_ %@" , unauditedArrangeMutableDictionary_ );
// NSLog( @"2 dateMutableArray_ %@" , dateMutableArray_ );
// NSLog( @"2 arrangeMutableDictionary_ %@" , arrangeMutableDictionary_ );
}
//将校区对应的数字改为具体校区
- (NSString*)getDistrictString:(NSString *)numberString
{
if ( [ numberString isEqual: @"1" ] )
return @"大学城";
else if ( [ numberString isEqual: @"2" ] )
return @"龙洞";
else if ( [ numberString isEqual: @"3" ] )
return @"东风路";
else if ( [ numberString isEqual: @"4" ] )
return @"商学院";
else
return NULL ;
}
#pragma mark -
#pragma mark Content Filtering
//搜索时调用的方法
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
// self.tableView = self.searchDisplayController.searchResultsTableView;
NSLog( @"scope is %@" , scope );
// NSLog( @"%@" , allArrangeMutableArray_ );
// NSLog( @"%@" , allOriginalMutableArray_ );
// NSLog( @"%@" , [ [ searchResultArray objectAtIndex: 0 ] objectAtIndex: 7 ] );
//隐藏工具条
[ self.navigationController setToolbarHidden: YES animated: YES ];
//新建被查询的数组存储要查询的是 全部 还是 未审核的
NSMutableArray* searchedMutableArray_ = [ [ [ NSMutableArray alloc ] init ] autorelease ];
//******************** 未开始搜索前先整理tableview ********************************************//
[ dateMutableArray_ removeAllObjects ];
[ allArrangeMutableArray_ removeAllObjects ];
[ allOriginalMutableArray_ removeAllObjects ];
[ originalMutableDictionary_ removeAllObjects ];
[ arrangeMutableDictionary_ removeAllObjects ];
if ( [ scope isEqual: @"全部" ] )
{
[ searchedMutableArray_ removeAllObjects ];
searchedMutableArray_ = (NSMutableArray*) searchResultArray;
}
else
{
[ searchedMutableArray_ removeAllObjects ];
searchedMutableArray_ = (NSMutableArray*) unauditedResultMutableArray_;
}
//*******************************************************************************************************//
NSLog( @"beingSearchedArray_ %@" , searchedMutableArray_ );
//新建数组存储被查询后的结果
NSMutableArray* beingSearchedResultMutableArray_ = [ [ [ NSMutableArray alloc ] init ] autorelease ];
//判断是否存在有searchtext
BOOL foundOutBool_ = NO;
// NSLog( @"%@" , searchText );
for ( NSArray* array in searchedMutableArray_ )
{
for ( NSString* item in array )
{
// NSLog( @"%@" , item );
if ( [ item isEqualToString: [ array objectAtIndex: 4 ] ] || [ item isEqualToString: [ array objectAtIndex: 6 ] ] )
{
if ( NSNotFound != [ item rangeOfString: searchText ].location )
{
NSLog( @"item %@" , item );
foundOutBool_ = YES;
}
else
{
foundOutBool_ = NO;
}
}
}
if ( foundOutBool_ )
{
[ beingSearchedResultMutableArray_ addObject: array ];
}
}
[ resultArrangeMutableArray_ removeAllObjects ]; // First clear the filtered array.
[ resultOriginalMutableArray_ removeAllObjects ];
[ resultDatesMutableArray_ removeAllObjects ];
[ resultArrangeMutableDictionary_ removeAllObjects ];
[ resultOriginalMutableDictionary_ removeAllObjects ];
[ self soutOutArray: beingSearchedResultMutableArray_ ];
NSLog( @"cha %@" , datesMutableArray_ );
NSLog( @"cha %@" , publicAllArrangeMutableArray_ );
NSLog( @"cha %@" , publicAllOriginalMutableArray_ );
resultDatesMutableArray_ = datesMutableArray_;
resultOriginalMutableArray_ = publicAllOriginalMutableArray_;
resultArrangeMutableArray_ = publicAllArrangeMutableArray_;
resultArrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: resultArrangeMutableArray_ forKeys: resultDatesMutableArray_ ];
resultOriginalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithObjects: resultOriginalMutableArray_ forKeys: resultDatesMutableArray_ ];
NSLog( @"cha %@" , resultArrangeMutableDictionary_ );
NSLog( @"cha %@" , resultOriginalMutableDictionary_ );
}
#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods
//下面是有输入字符的时候调用的函数
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
NSLog( @"S" );
if ( [ searchString length ])
{
[ self filterContentForSearchText: searchString
scope: [ [ self.searchDisplayController.searchBar scopeButtonTitles ] objectAtIndex: [ self.searchDisplayController.searchBar selectedScopeButtonIndex ] ] ];
}
return YES;
}
//下面是选择“全部” 或“未审核”的时候调用的函数
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchScope:(NSInteger)searchOption
{
NSLog( @"O" );
NSString* searchString = [ self.searchDisplayController.searchBar text ];
if ( [ searchString length ])
{
[ self filterContentForSearchText: searchString scope: [ [ self.searchDisplayController.searchBar scopeButtonTitles ] objectAtIndex: searchOption ] ];
}
return YES;
}
//下面是点击取消 或 没有搜索的时候调用的函数
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
NSLog( @"cancel" );
NSLog( @"cancel %@" , unchangingAllOriginalMutableDictionary_ );
NSLog( @"cancel %@" , unauditedOriginalMutableDictionary_ );
//显示工具条
[ self.navigationController setToolbarHidden: NO animated: YES ];
// First clear the filtered array.
[ dateMutableArray_ removeAllObjects ];
[ originalMutableDictionary_ removeAllObjects ];
[ arrangeMutableDictionary_ removeAllObjects ];
if ( [ [ [ self.searchDisplayController.searchBar scopeButtonTitles ] objectAtIndex: [ self.searchDisplayController.searchBar selectedScopeButtonIndex ] ] isEqual: @"全部" ])
{
for ( id key in unchangingAllOriginalMutableDictionary_ )
{
[ dateMutableArray_ addObject: key ];
}
originalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unchangingAllOriginalMutableDictionary_ ];
arrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unchangingAllArrangeMutableDictionary_ ];
}
else if ( [ [ [ self.searchDisplayController.searchBar scopeButtonTitles ] objectAtIndex: [ self.searchDisplayController.searchBar selectedScopeButtonIndex ] ] isEqual: @"未审核" ] )
{
for ( id key in unauditedOriginalMutableDictionary_ )
{
[ dateMutableArray_ addObject: key ];
}
originalMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unauditedOriginalMutableDictionary_ ];
arrangeMutableDictionary_ = [ [ NSMutableDictionary alloc ] initWithDictionary: unauditedArrangeMutableDictionary_ ];
}
[ self.tableView reloadData ];
}
@end