搜索显示控制器的问题

时间:2014-02-23 21:06:57

标签: ios searchdisplaycontroller

我正在学习使用iOS中的搜索栏和搜索显示控制器。我创建了一个带有两个视图的简单测试项目,一个视图包含一个UITableView和一个UISearchBar,当您从表视图中选择一行时,新视图会显示一个带有该行名称的标签。我遇到了一些问题,首先当我开始在搜索栏中添加文字并出现搜索显示时,搜索栏就消失了。显示过滤后的结果,但是当我选择一行时,它不会将我带到下一个视图,这只会在表被过滤时发生。这是代码:

ViewController.h

#import <UIKit/UIKit.h>
#import "DetailViewController.h"

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

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

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSArray *objects;
@property (nonatomic, strong) NSArray *filteredObjects;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _objects = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", @"Six", @"Seven", @"Eight", @"Nine", @"Ten", nil];
    _tableView.delegate = self;
    _tableView.dataSource = self;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [_filteredObjects count];

    } else {
        return [_objects count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [_filteredObjects objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [_objects objectAtIndex:indexPath.row];
    }

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ToDetail"]) {
        DetailViewController *detailViewController = [segue destinationViewController];

        if (self.searchDisplayController.active) {
            NSIndexPath *indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
            detailViewController.detailString = [_filteredObjects objectAtIndex:indexPath.row];
        } else {
            NSIndexPath *indexPath = [_tableView indexPathForSelectedRow];
            detailViewController.detailString = [_objects objectAtIndex:indexPath.row];
        }

    }
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchText];
    _filteredObjects = [_objects filteredArrayUsingPredicate:resultPredicate];
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

当我选择一行时它不会将我带到下一个视图,这只会在表被过滤时发生

因为您没有tableView:didSelectRowAtIndexPath:的实现。

请记住,实际上没有“过滤表视图”这样的东西。有两个表视图:正常的一个,以及由于搜索显示控制器而出现的一个。这是一个不同的表视图(基本上出现在你的前面),你必须根据你想要它做的任何事情来配置它,无论你希望它看起来如何。