我尝试为 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