1

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

在其中我有一个 tableview 和一个 tableview 的 detailview,最后一个搜索栏来过滤 tableview。

tableview 和 detailview 工作正常,但 searchhbar 不能正常工作。

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

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

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

希望有人可以帮助我,我的代码如下所示:

我的 *.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
4

1 回答 1

0

您的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;
    }

}
于 2012-11-13T23:53:42.523 回答