2014-03-03 191 views
0

一個固定的搜索欄和TableView中的目的是爲了實現一個固定的搜索欄,就像在iOS7聯繫人。實現自定義的UIViewController

我有一個名爲SearchViewController視圖控制器從UIViewController中繼承的。

而且我添加了一個搜索欄和的tableView作爲其navigationController.view的子視圖。

但是,由於搜索欄和的tableView是分開的,當我開始搜索,在正確地顯示在的tableView和結果表視圖沒有暗淡效應。

我只是希望它的行爲就像通訊錄應用程序。

這裏是我的代碼:

SearchViewController.h

#import <UIKit/UIKit.h> 
@class UWTabBarController; 
@class InfoSessionModel; 

@interface SearchViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate> 

SearchViewController.m

#import "SearchViewController.h" 
@interface SearchViewController() 

@property (nonatomic, strong) UISearchBar *searchBar; 
@property (nonatomic, strong) UISearchDisplayController *searchController; 
@property (nonatomic, strong) UITableView *tableView; 

@property (nonatomic, strong) NSArray *data; 

@end 

@implementation SearchViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // initiate search bar 
    NSInteger statusBarHeight = 20; 
    NSInteger navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 

    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, statusBarHeight + navigationBarHeight, 320, 44)]; 
// _searchBar.tintColor = [UIColor clearColor]; 
    _searchBar.delegate = self; 
    _searchBar.barStyle = UIBarStyleDefault; 
    //NSMutableArray *scopeTitles = [[NSMutableArray alloc] initWithObjects:@"Employer", @"Program", @"Note", nil]; 
    _searchBar.scopeButtonTitles = [[NSArray alloc] initWithObjects:@"Employer", @"Program", @"Note", nil];//[@"Employer|Program|Note" componentsSeparatedByString:@"|"]; 


    // initiate search bar controller 
    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self]; 
    _searchController.delegate = self; 
    _searchController.searchResultsDataSource = self; 
    _searchController.searchResultsDelegate = self; 

    // initiate table view 
    _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, statusBarHeight + navigationBarHeight, 320, [UIScreen mainScreen].bounds.size.height - statusBarHeight - navigationBarHeight)]; 
    [_tableView setContentInset:UIEdgeInsetsMake(_searchBar.frame.size.height, 0, _tabBarController.tabBar.frame.size.height, 0)]; 
    _tableView.delegate = self; 
    _tableView.dataSource = self; 

    [_tableView registerClass:[InfoSessionCell class] forCellReuseIdentifier:@"InfoSessionCell"]; 
    [_tableView registerClass:[LoadingCell class] forCellReuseIdentifier:@"LoadingCell"]; 

    [self.navigationController.view addSubview:_tableView]; 
    [self.navigationController.view addSubview:_searchBar]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (_searchController.searchResultsTableView == tableView) { 
     return 1; 
    } 
    else { 
     return [data count]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_searchController.searchResultsTableView == tableView) { 
     static NSString *cellIdentifier = @"LoadingCell"; 
     LoadingCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

     if (cell == nil) { 
      cell = [[LoadingCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     } 

     cell.loadingLabel.text = @"Test cell for search result"; 
     return cell; 
    } 
    else { 
      //... configure cell and return cell 
      return cell; 
     } 
    } 
} 

#pragma mark - UISearchDisplayController Delegate Methods 
// hasn't been implemented 

#pragma mark - UISearchBar Delegate Methods 
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 
    //move the search bar up to the correct location 
    [UIView animateWithDuration:.3 
        animations:^{ 
         searchBar.frame = CGRectMake(searchBar.frame.origin.x, 
                 20,// status bar's height 
                 searchBar.frame.size.width, 
                 searchBar.frame.size.height); 
        } 
        completion:^(BOOL finished){ 
         //whatever else you may need to do 
        }]; 
    return YES; 
} 

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar { 
    //move the search bar down to the correct location 
    [UIView animateWithDuration:.25 
        animations:^{ 
         NSInteger statusBarHeight = 20; 
         NSInteger navigationBarHeight = self.navigationController.navigationBar.frame.size.height; 
         searchBar.frame = CGRectMake(_searchBar.frame.origin.x, 
                 statusBarHeight + navigationBarHeight, 
                 _searchBar.frame.size.width, 
                 _searchBar.frame.size.height); 
        } 
        completion:^(BOOL finished){ 
         //whatever else you may need to do 
        }]; 
    return YES; 
} 

這是我的代碼的效果: enter image description here

enter image description here

回答

0

好的,我的問題是由於我對視圖和navigationController視圖的誤解造成的。

鑑於沒有加載方法: 之前就是:

[self.navigationController.view addSubview:_tableView]; 
[self.navigationController.view addSubview:_searchBar]; 

,但應該是:

[self.view addSubview:_tableView]; 
[self.view addSubview:_searchBar]; 

這樣一來,原來的表視圖和結果表視圖會正確顯示。

還有其它的事情正在搜索欄上下,這些事情應該通過委託的UISearchBar協議的方法和UISearchDisplayController委託協議的方法來完成。

這是一個正確的方法來實現一個固定searchBar和tableView它下面