视图控制器中的搜索栏 (uitableview)



我尝试为iPhone创建一个简单的应用程序。

在其中,我有一个表视图和一个表视图

的详细视图,最后一个搜索栏用于过滤表视图。

表视图和详细信息视图工作正常,但搜索栏无法正常工作。

当我输入搜索词时,它会显示整个表格视图,而详细视图不起作用搜索模式。

当我取消搜索模式时,详细信息视图再次工作。

所以很明显我的过滤器代码

是错误的,我的过滤器代码中没有我的详细视图,但我现在不知道如何正确做到这一点。

希望有人可以帮助我,我的代码看起来像这样:

我的 *.h 文件:

#import <UIKit/UIKit.h>
@class DetailViewController;
@interface MasterViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate>
{
    NSArray *originalData;
    NSMutableArray *searchData;
    UISearchBar *searchBar;
    UISearchDisplayController *searchDisplayController;
}
@property (strong, nonatomic) DetailViewController *detailViewController;
@end

我的 *.m 文件:

#import "MasterViewController.h"
#import "DetailViewController.h"
@interface MasterViewController () {
    NSMutableArray *_objects;
}
@end
@implementation MasterViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Opslag", @"Opslag");
        _objects = [[NSMutableArray alloc] init];
        //title
        //detail
        NSDictionary * obj1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"this_title", @"title", @"this_detail", @"detail", nil];
        NSDictionary * obj2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title2", @"title", @"some_detail2", @"detail", nil];
        NSDictionary * obj3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title3", @"title", @"some_detail3", @"detail", nil];
        NSDictionary * obj4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title4", @"title", @"some_detail4", @"detail", nil];
        [_objects addObject:obj1];
        [_objects addObject:obj2];
        [_objects addObject:obj3];
        [_objects addObject:obj4];
        originalData = [[NSArray alloc] initWithObjects:obj1, obj2, obj3, nil];
        searchData = [[NSMutableArray alloc] init];

    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 160, 44)];
    searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    searchDisplayController.delegate = self;
    searchDisplayController.searchResultsDataSource = self;
    self.tableView.tableHeaderView = searchBar;
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table View
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _objects.count;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    cell.textLabel.text = [[_objects objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.detailTextLabel.text = [[_objects objectAtIndex:indexPath.row] objectForKey:@"detail"];


    return cell;
}
#pragma mark - searchDisplayControllerDelegate
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [searchData removeAllObjects];
    NSArray *group;
    for(group in originalData)
    {
        NSMutableArray *newGroup = [[NSMutableArray alloc] init];
        NSString *element;
        for(element in group)
        {
            NSRange range = [element rangeOfString:searchString options:NSCaseInsensitiveSearch];
            if (range.length > 0) {
                [newGroup addObject:element];
            }
        }
        if ([newGroup count] > 0) {
            [searchData addObject:newGroup];
        }

    }
    return YES;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!self.detailViewController) {
        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    }
    NSDictionary *object = _objects[indexPath.row];
    self.detailViewController.detailItem = [object objectForKey:@"detail"];
    self.detailViewController.titleItem = [object objectForKey:@"title"];
    [self.navigationController pushViewController:self.detailViewController animated:YES];
}
@end

您的cellForRowAtIndexPath方法始终是从_objects数组中选取,在执行搜索时永远不会更改该数组。当调用shouldReloadTableForSearchString时,你只填充searchData,它永远不会反馈到cellForRowAtIndexPathnumberOfRowsInSection显示过滤结果。

处理此问题的一种方法是在您的cellForRowAtIndexPath中执行以下操作(未经测试):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    NSArray* sourceArray = tableView == self.searchDisplayController.searchResultsTableView ? searchData : _objects;
    cell.textLabel.text = [[sourceArray objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.detailTextLabel.text = [[sourceArray objectAtIndex:indexPath.row] objectForKey:@"detail"];
    return cell;
}

也在你的numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView){
        return searchData.count;
    }else
    {
       return _objects.count;
    }
}

最新更新