在storyboard中的静态UITableView中拖入 UISearchBar and Search Display Controller出现的奇怪问题

来源:互联网 发布:淘宝上买cpu可靠吗 编辑:程序博客网 时间:2024/05/29 12:31
     最近学习过程中想模拟一下新浪微博“发现”界面。
     我在storyboard中拖入一个UITableViewController,设置这个UITableViewController的TableView为Static Cells,然后添加了两个Section,每个Section两行Cell。
     接下来往这个TableView中拖入了一个UISearchBar and Search Display Controller,storyboard中的结构如下图:



    
    
     然后在UITableViewController对应的WBDiscoverTableViewController.m中实现相关的协议方法。代码如下:

#import"WBDiscoverTableViewController.h"

@interfaceWBDiscoverTableViewController ()
@property (weak,nonatomic)IBOutletUISearchBar *mySearchbar;
@property (nonatomic,strong)NSArray *results;
@property (weak,nonatomic)IBOutletUITableViewCell *hotTopicsCell1;
@property (weak,nonatomic)IBOutletUITableViewCell *hotTopicsCell2;
@property (weak,nonatomic)IBOutletUITableViewCell *nearbyPeopleCell;
@property (weak,nonatomic)IBOutletUITableViewCell *nearbyWeiboCell;
@end

@implementation WBDiscoverTableViewController

- (
void)viewDidLoad {
    [superviewDidLoad];

   staticNSString *cellID =@"resultCell";
    [
self.searchDisplayController.searchResultsTableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:cellID];
}

- (
void)viewWillAppear:(BOOL)animated {

}

- (void)searchWithString {
   
switch (self.mySearchbar.selectedScopeButtonIndex) {
       
case0:
           
//搜用户
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsUsersWithString:self.mySearchbar.textAndCount:20CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                   
                }];
            }
           
break;
       
case1:
           
//搜学校
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsSchoolsWithString:self.mySearchbar.textAndCount:20AndType:0CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                }];
            }
           
break;
       
case2:
           
//搜公司
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsCompaniesWithString:self.mySearchbar.textAndCount:20CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                }];
            }
           
break;
       
default:
           
break;
    }
}

#pragma mark UISearchBarDelegate
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [
selfsearchWithString];
   
}

#pragma mark UISearchDisplayDelegate

- (
void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
   
NSLog(@"WillBeginSearch....");
}

- (
void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
   
NSLog(@"DidBeginSearch....");
}

- (
void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
   
NSLog(@"WillEndSearch....");
}

- (
void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
   
NSLog(@"DidEndSearch....");
}

- (
BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [
selfsearchWithString];
   
returnNO;
}

- (
BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    [
selfsearchWithString];
   
returnNO;
}

#pragma mark - Table view data source
//由于这个控制器既是原来的WBDiscoverTableViewController,又是UISearchDisplayControllersearchContentsController
//WBDiscoverTableViewControllertableViewsearchResultsTableViewdelegat都指向这个对象(self),
//所以需要在回调中区别到底是哪个tableView

- (
NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   
if (tableView ==self.tableView) {
       
return2;
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView){
       
return1;
    }
else
       
return0;
}

- (
NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   
if (tableView ==self.tableView) {
       
return2;
       
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView) {
       
returnself.results.count;

    }
else
       
return0;
}

- (
UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   
if (tableView ==self.tableView) {
       
       
if (indexPath.section == 0 && indexPath.row == 0) {
           
returnself.hotTopicsCell1;
        }
elseif (indexPath.section == 0 && indexPath.row == 1) {
           
returnself.hotTopicsCell2;
        }
elseif (indexPath.section == 1 && indexPath.row == 0) {
           
returnself.nearbyPeopleCell;
        }
else {
           
returnself.nearbyWeiboCell;
        }
       
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView) {

       
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"resultCell"];
       
id result =self.results[indexPath.row];
       
if ([resultisMemberOfClass:[WBSearchSuggestionsOfUsersclass]]) {
           
WBSearchSuggestionsOfUsers * suggestion = result;
            cell.
textLabel.text = suggestion.nickName;
            cell.
detailTextLabel.text = suggestion.followersCount;
        }
elseif ([resultisMemberOfClass:[WBSearchSuggestionsOfSchoolsclass]]) {
           
WBSearchSuggestionsOfSchools *suggestion = result;
            cell.
textLabel.text = suggestion.schoolName;
            cell.
detailTextLabel.text = suggestion.location;
        }
else {
           
WBSearchSuggestionsOfCompanies *suggestion = result;
            cell.
textLabel.text = suggestion.suggestion;
        }
       
return cell;
    }
else
       
returnnil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
       
return10;
}

- (
void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   
UIViewController *vc = [[UIViewControlleralloc]init];
    vc.
view.backgroundColor = [UIColorwhiteColor];
    [
self.navigationControllerpushViewController:vcanimated:YES];
   
    }

@end

     当我在UISearchBar中输入关键字进行搜索,如果返回结果的数量(self.results.count)大于2的时候,程序就会崩溃,错误原因:reason: '*** -[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]
     看起来是数组访问越界了,也就是说数组中只有两个对象,但是却访问了index为2的对象,于是程序就崩溃了。检查了代码,并没有什么异常,最后想到是不是静态TableView导致的问题呢?
     于是决定将TableView修改为动态的,并修改WBDiscoverTableViewController.m中的代码:

#import"WBDiscoverTableViewController.h"

@interfaceWBDiscoverTableViewController ()
@property (weak,nonatomic)IBOutletUISearchBar *mySearchbar;
@property (nonatomic,strong)NSArray *results;
@end

@implementation WBDiscoverTableViewController

- (
void)viewDidLoad {
    [
superviewDidLoad];
     
    [self.searchDisplayController.searchResultsTableViewregisterNib:[UINibnibWithNibName:@"WBsearchSuggestionCell"bundle:[NSBundlemainBundle]]forCellReuseIdentifier:@"WBsearchSuggestionCell"];
   
    [
self.tableViewregisterNib:[UINibnibWithNibName:@"hotTopicsCell1"bundle:[NSBundlemainBundle]]forCellReuseIdentifier:@"hotTopicsCell1"];
   
    [
self.tableViewregisterNib:[UINibnibWithNibName:@"hotTopicsCell2"bundle:[NSBundlemainBundle]]forCellReuseIdentifier:@"hotTopicsCell2"];
   
    [
self.tableViewregisterNib:[UINibnibWithNibName:@"nearbyPeopleCell"bundle:[NSBundlemainBundle]]forCellReuseIdentifier:@"nearbyPeopleCell"];
   
    [
self.tableViewregisterNib:[UINibnibWithNibName:@"nearbyWeiboCell"bundle:[NSBundlemainBundle]]forCellReuseIdentifier:@"nearbyWeiboCell"];
   
}


- (void)searchWithString {
   
switch (self.mySearchbar.selectedScopeButtonIndex) {
       
case0:
           
//搜用户
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsUsersWithString:self.mySearchbar.textAndCount:20CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                   
                }];
            }
           
break;
       
case1:
           
//搜学校
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsSchoolsWithString:self.mySearchbar.textAndCount:20AndType:0CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                }];
            }
           
break;
       
case2:
           
//搜公司
           
if ([[NSUserDefaultsstandardUserDefaults]objectForKey:@"accessToken"]) {
                [[
WBWeiboAPIshareWeiboApi]searchSuggestionsCompaniesWithString:self.mySearchbar.textAndCount:20CompletionCallBack:^(id obj) {
                   
self.results = obj;
                   
dispatch_async(dispatch_get_main_queue(), ^{
                       
NSLog(@"self.results.count :%ld", self.results.count);
                        [
self.searchDisplayController.searchResultsTableViewreloadData];
                    });
                }];
            }
           
break;
       
default:
           
break;
    }
}

#pragma mark UISearchBarDelegate
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [
selfsearchWithString];
   
}


#pragma mark UISearchDisplayDelegate

- (
void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
   
NSLog(@"WillBeginSearch....");
}

- (
void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
   
NSLog(@"DidBeginSearch....");
}

- (
void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
   
NSLog(@"WillEndSearch....");
}

- (
void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
   
NSLog(@"DidEndSearch....");
}

- (
BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [
selfsearchWithString];
   
returnNO;
}

- (
BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    [
selfsearchWithString];
   
returnNO;
}

#pragma mark - Table view data source
//由于这个控制器既是原来的WBDiscoverTableViewController,又是UISearchDisplayControllersearchContentsController
//WBDiscoverTableViewControllertableViewsearchResultsTableViewdelegat都指向这个对象(self),
//所以需要在回调中区别到底是哪个tableView

- (
NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   
if (tableView ==self.tableView) {
       
return2;
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView){
       
return1;
    }
else
       
return0;
}

- (
NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   
if (tableView ==self.tableView) {
       
return2;
       
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView) {
       
returnself.results.count;

    }
else
       
return0;
}

- (
UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   
if (tableView ==self.tableView) {
   
       
if (indexPath.section == 0 && indexPath.row == 0) {
           
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"hotTopicsCell1"forIndexPath:indexPath];
           
return cell;
        }
elseif (indexPath.section == 0 && indexPath.row == 1) {
           
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"hotTopicsCell2"forIndexPath:indexPath];
           
return cell;
        }
elseif (indexPath.section == 1 && indexPath.row == 0) {
           
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"nearbyPeopleCell"forIndexPath:indexPath];
           
return cell;
        }
else {
           
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"nearbyWeiboCell"forIndexPath:indexPath];
           
return cell;
        }
       
    }
elseif (tableView ==self.searchDisplayController.searchResultsTableView) {

       
WBsearchSuggestionCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"WBsearchSuggestionCell"forIndexPath:indexPath];
       
id result =self.results[indexPath.row];
       
       
if ([resultisMemberOfClass:[WBSearchSuggestionsOfUsersclass]]) {
           
WBSearchSuggestionsOfUsers * suggestion = result;
            cell.
suggestion.text = suggestion.nickName;
        }
elseif ([resultisMemberOfClass:[WBSearchSuggestionsOfSchoolsclass]]) {
           
WBSearchSuggestionsOfSchools *suggestion = result;
            cell.
suggestion.text = suggestion.schoolName;
           
        }
else {
           
WBSearchSuggestionsOfCompanies *suggestion = result;
            cell.
suggestion.text = suggestion.suggestion;
        }
       
return cell;
    }
else
       
returnnil;
}


- (
CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
       
return10;
}

- (
void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView
deselectRowAtIndexPath:indexPathanimated:YES];

   
UIViewController *vc = [[UIViewControlleralloc]init];
    vc.
view.backgroundColor = [UIColorwhiteColor];
    [
self.navigationControllerpushViewController:vcanimated:YES];
   
}

@end

     测试,问题解决了!
     但是仍然心存疑问,为什么静态TableView会影响UISearchBar and Search Display Controller中 searchResultsTableView的cell?


0 0
原创粉丝点击