[轉載地址]:http://blog.csdn.net/riveram/article/details/7340479
1.創建一個Navigation—based—Application項目,這樣Interface Builder中會自動生成一個Table View,然後將Search Bar拖放到表示圖上,以我們要給表示圖添加搜索功能,不要忘記將Search Bar的delegate連接到File‘s Owner項,然後將Search Bar與searchBar變量連接。
2.在Resources文件夾下創建一個Movies.plist文件,然後爲該文件添加一些數據,如下圖:
3.在.h頭文件添加如下內容:
- #import <UIKit/UIKit.h>
- @interface MyTableView : UITableViewController <UISearchBarDelegate>{
- NSDictionary *movieTitles;
- NSArray *years;
- IBOutlet UISearchBar *searchBar;
- BOOL isSearchOn;
- BOOL canSelectRow;
- //下面兩個是搜索用到的兩個變量
- NSMutableArray *listOfMovies;
- NSMutableArray *searchResult;
- }
- @property(nonatomic,retain) NSDictionary *movieTitles;
- @property(nonatomic,retain)NSArray *years;
- @property(nonatomic,retain)UISearchBar *searchBar;
- -(void)donSearching:(id)sender;
- -(void)searchMoviesTableView;
- @end
#import <UIKit/UIKit.h>
@interface MyTableView : UITableViewController <UISearchBarDelegate>{
NSDictionary *movieTitles;
NSArray *years;
IBOutlet UISearchBar *searchBar;
BOOL isSearchOn;
BOOL canSelectRow;
//下面兩個是搜索用到的兩個變量
NSMutableArray *listOfMovies;
NSMutableArray *searchResult;
}
@property(nonatomic,retain) NSDictionary *movieTitles;
@property(nonatomic,retain)NSArray *years;
@property(nonatomic,retain)UISearchBar *searchBar;
-(void)donSearching:(id)sender;
-(void)searchMoviesTableView;
@end
4.當加載View窗口時,首先定位屬性列表並把這個列表加載到listOfMovies中,然後將所有的年份提取到years中,然後添加搜索條並初始化搜索條用到的數據:
- //讀取Movies.plist文件的內容到變量裏面
- - (void)viewDidLoad
- {
- NSString *path = [[NSBundle mainBundle]pathForResource:@"Movies" ofType:@"plist"];
- NSDictionary *dic = [[NSDictionary alloc]initWithContentsOfFile:path];
- self.movieTitles = dic;
- [dic release];
- NSArray *array = [[self.movieTitles allKeys]sortedArrayUsingSelector:@selector(compare:)];
- self.years = array;
- //下面兩句是添加搜索條
- self.tableView.tableHeaderView = searchBar;
- self.searchBar.autocorrectionType = UITextAutocorrectionTypeYes;
- //初始化listofmovies
- listOfMovies = [[NSMutableArray alloc]init];
- for (NSString *year in years) {
- NSArray *movies = [movieTitles objectForKey:year];
- for(NSString *title in movies){
- [listOfMovies addObject:title];
- }
- }
- searchResult = [[NSMutableArray alloc]init];
- isSearchOn = NO;
- canSelectRow = YES;
- [super viewDidLoad];
- }
//讀取Movies.plist文件的內容到變量裏面
- (void)viewDidLoad
{
NSString *path = [[NSBundle mainBundle]pathForResource:@"Movies" ofType:@"plist"];
NSDictionary *dic = [[NSDictionary alloc]initWithContentsOfFile:path];
self.movieTitles = dic;
[dic release];
NSArray *array = [[self.movieTitles allKeys]sortedArrayUsingSelector:@selector(compare:)];
self.years = array;
//下面兩句是添加搜索條
self.tableView.tableHeaderView = searchBar;
self.searchBar.autocorrectionType = UITextAutocorrectionTypeYes;
//初始化listofmovies
listOfMovies = [[NSMutableArray alloc]init];
for (NSString *year in years) {
NSArray *movies = [movieTitles objectForKey:year];
for(NSString *title in movies){
[listOfMovies addObject:title];
}
}
searchResult = [[NSMutableArray alloc]init];
isSearchOn = NO;
canSelectRow = YES;
[super viewDidLoad];
}
5.在自動生成的方法numberOfSectionsInTableView中添加如下代碼,表示告訴表示圖一共分多少節:
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- if (isSearchOn) {
- return 1;//如果正在搜索就只有一個section
- }
- else
- return [self.years count];
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- if (isSearchOn) {
- return [searchResult count];
- }else{
- // Return the number of rows in the section.
- NSString *year = [self.years objectAtIndex:section];
- NSArray *movieSection = [self.movieTitles objectForKey:year];
- return [movieSection 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];
- }
- if (isSearchOn) {
- NSString *cellValue = [searchResult objectAtIndex:indexPath.row];
- cell.textLabel.text = cellValue;
- }else{
- NSString *year = [self.years objectAtIndex:[indexPath section]];//得到當前行所在的section
- NSArray *movieSection = [self.movieTitles objectForKey:year];
- cell.textLabel.text = [movieSection objectAtIndex:[indexPath row]];
- cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
- }
- //爲每一行添加圖片
- UIImage *image = [UIImage imageNamed:@"apple.jpeg"];
- cell.imageView.image = image;
- return cell;
- }
- //設置每個section的標題
- -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
- NSString *year = [self.years objectAtIndex:section];
- if (isSearchOn) {
- return nil;
- }
- else{
- return year;
- }
- }
- //添加索引
- -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
- if (isSearchOn)
- return nil;
- else
- return years;
- }
- //搜索筐得到焦點後
- -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
- isSearchOn = YES;
- canSelectRow = NO;
- self.tableView.scrollEnabled = NO;
- //添加down按鈕及其點擊方法
- self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donSearching:)]autorelease];
- }
- //點擊down按鈕後
- -(void)donSearching:(id)sender{
- isSearchOn = NO;
- canSelectRow = YES;
- self.tableView.scrollEnabled = YES;
- self.navigationItem.rightBarButtonItem = nil;
- [searchBar resignFirstResponder];
- [self.tableView reloadData];
- }
- //搜索筐裏面的文字改變後
- -(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
- if ([searchText length]>0) {
- isSearchOn = YES;
- canSelectRow = YES;
- self.tableView.scrollEnabled = YES;
- [self searchMoviesTableView];//調用搜索方法
- }
- else{
- isSearchOn = NO;
- canSelectRow = NO;
- self.tableView.scrollEnabled = NO;
- }
- [self.tableView reloadData];
- }
- //自定義的搜索方法,得到搜索結果
- -(void)searchMoviesTableView{
- [searchResult removeAllObjects];
- for (NSString *str in listOfMovies) {
- NSRange titleResultsRange = [str rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];
- if (titleResultsRange.length > 0) {
- [searchResult addObject:str];
- }
- }
- }
- -(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar{
- [self searchMoviesTableView];
- }
- //點擊table某一行跳轉頁面
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- MyTableViewOneMessage *mytm = [[MyTableViewOneMessage alloc]initWithNibName:@"MyTableViewOneMessage" bundle:nil];
- NSString *year = [self.years objectAtIndex:[indexPath section]];
- NSArray *movieSection = [self.movieTitles objectForKey:year];
- NSString *movieTitle = [movieSection objectAtIndex:[indexPath row]];
- NSString *message = [[NSString alloc]initWithFormat:@"%@",movieTitle];
- mytm.message = message;
- [self.navigationController pushViewController:mytm animated:YES];
- [mytm release];
- }
Interface Builder中添加兩個lable,具體的就不詳細了,很簡單的,下面是這個界面的.h和.m文件:
- #import <UIKit/UIKit.h>
- @interface MyTableViewOneMessage : UIViewController {
- IBOutlet UILabel *mylable;
- NSString *message;
- }
- @property(nonatomic,retain)UILabel *mylable;
- @property(nonatomic,retain)NSString *message;
- @end
- #import "MyTableViewOneMessage.h"
- @implementation MyTableViewOneMessage
- @synthesize mylable;
- @synthesize message;
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- // Custom initialization
- }
- return self;
- }
- -(void)viewDidAppear:(BOOL)animated{
- self.mylable.text = message;
- }
- - (void)dealloc
- {
- [mylable release];
- [message release];
- [super dealloc];
- }
- - (void)didReceiveMemoryWarning
- {
- // Releases the view if it doesn't have a superview.
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc that aren't in use.
- }
- #pragma mark - View lifecycle
- - (void)viewDidLoad
- {
- self.navigationItem.title = @"Tableview傳過來的值";
- [super viewDidLoad];
- // Do any additional setup after loading the view from its nib.
- }
- - (void)viewDidUnload
- {
- [super viewDidUnload];
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- // Return YES for supported orientations
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- }
- @end