表視圖的範例

[轉載地址]: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頭文件添加如下內容:

  1. #import <UIKit/UIKit.h>   
  2.   
  3.   
  4. @interface MyTableView : UITableViewController <UISearchBarDelegate>{  
  5.     NSDictionary *movieTitles;  
  6.     NSArray *years;  
  7.       
  8.     IBOutlet UISearchBar *searchBar;  
  9.       
  10.     BOOL isSearchOn;  
  11.     BOOL canSelectRow;  
  12.       
  13.     //下面兩個是搜索用到的兩個變量   
  14.     NSMutableArray *listOfMovies;  
  15.     NSMutableArray *searchResult;  
  16. }  
  17. @property(nonatomic,retain) NSDictionary *movieTitles;  
  18. @property(nonatomic,retain)NSArray *years;  
  19. @property(nonatomic,retain)UISearchBar *searchBar;  
  20.   
  21. -(void)donSearching:(id)sender;  
  22. -(void)searchMoviesTableView;  
  23. @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中,然後添加搜索條並初始化搜索條用到的數據:

  1. //讀取Movies.plist文件的內容到變量裏面   
  2. - (void)viewDidLoad  
  3. {  
  4.    NSString *path = [[NSBundle mainBundle]pathForResource:@"Movies" ofType:@"plist"];  
  5.     NSDictionary *dic = [[NSDictionary alloc]initWithContentsOfFile:path];  
  6.     self.movieTitles = dic;  
  7.     [dic release];  
  8.       
  9.     NSArray *array = [[self.movieTitles allKeys]sortedArrayUsingSelector:@selector(compare:)];  
  10.     self.years = array;  
  11.       
  12.     //下面兩句是添加搜索條   
  13.     self.tableView.tableHeaderView = searchBar;  
  14.     self.searchBar.autocorrectionType = UITextAutocorrectionTypeYes;  
  15.       
  16.     //初始化listofmovies   
  17.     listOfMovies = [[NSMutableArray alloc]init];  
  18.     for (NSString *year in years) {  
  19.         NSArray *movies = [movieTitles objectForKey:year];  
  20.         for(NSString *title in movies){  
  21.             [listOfMovies addObject:title];  
  22.         }  
  23.     }  
  24.   
  25.     searchResult = [[NSMutableArray alloc]init];  
  26.       
  27.     isSearchOn = NO;  
  28.     canSelectRow = YES;  
  29.     [super viewDidLoad];  
  30.   
  31. }  
//讀取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中添加如下代碼,表示告訴表示圖一共分多少節:

  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  2. {  
  3.     if (isSearchOn) {  
  4.         return 1;//如果正在搜索就只有一個section  
  5.     }  
  6.   else  
  7.     return [self.years count];  
  8. }  
6.在自動生成的方法tableView:numberOfRowsInSection:中添加如下代碼,表示告訴表視圖每一節顯示多少行:

  1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  2. {  
  3.   
  4.     if (isSearchOn) {  
  5.         return [searchResult count];  
  6.     }else{  
  7.     // Return the number of rows in the section.  
  8.     NSString *year = [self.years objectAtIndex:section];  
  9.     NSArray *movieSection = [self.movieTitles objectForKey:year];  
  10.     return [movieSection count];  
  11.     }  
  12. }  
7.在自動生成的方法tableView:cellForRowAtIndexPath:中添加如下代碼,爲每一行設值:

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     static NSString *CellIdentifier = @"Cell";  
  4.       
  5.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
  6.     if (cell == nil) {  
  7.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
  8.     }  
  9.       
  10.     if (isSearchOn) {  
  11.         NSString *cellValue = [searchResult objectAtIndex:indexPath.row];  
  12.         cell.textLabel.text = cellValue;  
  13.     }else{  
  14.     NSString *year = [self.years objectAtIndex:[indexPath section]];//得到當前行所在的section  
  15.     NSArray *movieSection = [self.movieTitles objectForKey:year];  
  16.     cell.textLabel.text = [movieSection objectAtIndex:[indexPath row]];  
  17.           
  18.         cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;  
  19.     }  
  20.       
  21.     //爲每一行添加圖片   
  22.     UIImage *image = [UIImage imageNamed:@"apple.jpeg"];  
  23.     cell.imageView.image = image;  
  24.       
  25.     return cell;  
  26. }  
8.實現tableView:titleForHeaderInSection:方法,將得到的年份作爲每一節的Header:

  1. //設置每個section的標題   
  2. -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
  3.     NSString *year = [self.years objectAtIndex:section];  
  4.     if (isSearchOn) {  
  5.         return nil;  
  6.     }  
  7.     else{  
  8.     return year;  
  9.     }  
  10.     }  
9.爲表格添加索引,只需要實現sectionIndexTitlesForTableView:方法,該方法返回每一節的Header數組:

  1. //添加索引   
  2. -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{  
  3.     if (isSearchOn)   
  4.         return nil;  
  5.     else  
  6.     return years;  
  7. }  
10.當用戶點擊搜索欄會促發searchBarTextDidBeginEditing:事件(UISearchBarDelegate協議中定義的一個方法,我們在.h頭文件中實現了這個協議),在該方法中,向屏幕右上角添加一個Done按鈕,當用戶點擊Done按鈕時會調用doneSearching方法:

  1. //搜索筐得到焦點後   
  2. -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{  
  3.     isSearchOn = YES;  
  4.     canSelectRow = NO;  
  5.     self.tableView.scrollEnabled = NO;  
  6.     //添加down按鈕及其點擊方法   
  7.     self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donSearching:)]autorelease];  
  8. }  
11.doneSearching方法使得搜索欄移除了First Responder狀態,因而會隱藏鍵盤,同時,通過調用表視圖的reloadData方法重新加載表視圖:

  1. //點擊down按鈕後   
  2. -(void)donSearching:(id)sender{  
  3.     isSearchOn = NO;  
  4.     canSelectRow = YES;  
  5.     self.tableView.scrollEnabled = YES;  
  6.     self.navigationItem.rightBarButtonItem = nil;  
  7.       
  8.     [searchBar resignFirstResponder];  
  9.       
  10.     [self.tableView reloadData];  
  11. }  
12.當用戶在搜索欄中輸入時,輸入的每個字符都會觸發searchBar:textDidChange:事件,只要搜索欄中有一個字符,就會調用searchMoviesTableView方法:

  1. //搜索筐裏面的文字改變後   
  2. -(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{  
  3.     if ([searchText length]>0) {  
  4.         isSearchOn = YES;  
  5.         canSelectRow = YES;  
  6.         self.tableView.scrollEnabled = YES;  
  7.         [self searchMoviesTableView];//調用搜索方法  
  8.     }  
  9.     else{  
  10.         isSearchOn = NO;  
  11.         canSelectRow = NO;  
  12.         self.tableView.scrollEnabled = NO;  
  13.     }  
  14.     [self.tableView reloadData];  
  15. }  
13.searchMoviesTableView方法會搜索listOfMovies數組,通過NSString類的rangeOfString:options:方法,使用特定的字符串對每個名稱進行搜索,返回的結果是一個nsRange對象,如果長度大於0就表示有一個匹配結果,將它添加到searchResult書組中:

  1. //自定義的搜索方法,得到搜索結果   
  2. -(void)searchMoviesTableView{  
  3.     [searchResult removeAllObjects];  
  4.     for (NSString *str in listOfMovies) {  
  5.         NSRange titleResultsRange = [str rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];  
  6.         if (titleResultsRange.length > 0) {  
  7.             [searchResult addObject:str];  
  8.         }  
  9.     }  
  10. }  
14.當用戶點擊鍵盤上的Search按鈕時,就會調用如下方法:

  1. -(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar{  
  2.     [self searchMoviesTableView];  
  3. }  
15.新建一個新的文件,該文件在後面定義,點擊表格的某一行後就會調轉到該頁面去並將點擊的那一樣的名稱傳過去,要想做到這一點必須實現如下方法:

  1. //點擊table某一行跳轉頁面   
  2. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
  3. {  
  4.     MyTableViewOneMessage *mytm = [[MyTableViewOneMessage alloc]initWithNibName:@"MyTableViewOneMessage" bundle:nil];  
  5.       
  6.     NSString *year = [self.years objectAtIndex:[indexPath section]];  
  7.     NSArray *movieSection = [self.movieTitles objectForKey:year];  
  8.     NSString *movieTitle = [movieSection objectAtIndex:[indexPath row]];  
  9.     NSString *message = [[NSString alloc]initWithFormat:@"%@",movieTitle];  
  10.     mytm.message = message;  
  11.     [self.navigationController pushViewController:mytm animated:YES];  
  12.     [mytm release];  
  13. }  
16.新添加的頁面很簡單,主要用來測試表格的點擊事件,導航然後顯示傳過來的字符串:

Interface Builder中添加兩個lable,具體的就不詳細了,很簡單的,下面是這個界面的.h和.m文件:

  1. #import <UIKit/UIKit.h>   
  2.   
  3.   
  4. @interface MyTableViewOneMessage : UIViewController {  
  5.     IBOutlet UILabel *mylable;  
  6.     NSString *message;  
  7. }  
  8.   
  9. @property(nonatomic,retain)UILabel *mylable;  
  10. @property(nonatomic,retain)NSString *message;  
  11.   
  12. @end  
  1. #import "MyTableViewOneMessage.h"  
  2.   
  3.   
  4. @implementation MyTableViewOneMessage  
  5.   
  6. @synthesize mylable;  
  7. @synthesize message;  
  8.   
  9. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
  10. {  
  11.     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
  12.     if (self) {  
  13.         // Custom initialization  
  14.     }  
  15.     return self;  
  16. }  
  17.   
  18. -(void)viewDidAppear:(BOOL)animated{  
  19.     self.mylable.text = message;  
  20. }  
  21.   
  22. - (void)dealloc  
  23. {  
  24.     [mylable release];  
  25.     [message release];  
  26.     [super dealloc];  
  27. }  
  28.   
  29. - (void)didReceiveMemoryWarning  
  30. {  
  31.     // Releases the view if it doesn't have a superview.  
  32.     [super didReceiveMemoryWarning];  
  33.       
  34.     // Release any cached data, images, etc that aren't in use.  
  35. }  
  36.   
  37. #pragma mark - View lifecycle  
  38.   
  39. - (void)viewDidLoad  
  40. {  
  41.     self.navigationItem.title = @"Tableview傳過來的值";  
  42.     [super viewDidLoad];  
  43.     // Do any additional setup after loading the view from its nib.  
  44. }  
  45.   
  46. - (void)viewDidUnload  
  47. {  
  48.     [super viewDidUnload];  
  49.     // Release any retained subviews of the main view.  
  50.     // e.g. self.myOutlet = nil;   
  51. }  
  52.   
  53. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  54. {  
  55.     // Return YES for supported orientations  
  56.     return (interfaceOrientation == UIInterfaceOrientationPortrait);  
  57. }  
  58.   
  59. @end  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章