我想在storyboard xcode中为我的表创建searchBar,Everythings适合我,我没有任何错误,只是搜索不起作用。
我看到了这两个教程,但仍然无效。我无法搜索。 我的教程:
-http://stackoverflow.com/questions/9897171/uisearchbar-implemented-with-storyboards
-http://www.youtube.com/watch?v=IqDZHgI_s24
你能帮我吗?
在此先感谢!
这是我的代码
CreateViewController.h
#import <UIKit/UIKit.h>
@interface CreateViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate>
{
// @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
NSArray *datas;
NSMutableArray *displayItems;
IBOutlet UITableView * tableView;
IBOutlet UISearchBar * searchbar;
}
@end
CreateViewController.m
#import "CreateViewController.h"
@interface CreateViewController ()
@end
@implementation CreateViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
datas = [NSMutableArray arrayWithObjects:@"Johan", @"Paul",@"George",@"Ringo", nil];
displayItems = [[NSMutableArray alloc] initWithArray:datas];
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [datas count];
}
- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";//This is the identifier in storyboard
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
cell.textLabel.text = [datas objectAtIndex:indexPath.row];
return cell;
}
-(void)searchbar:(UISearchBar *)searchbar textDidChange:(NSString *)searchText{
if([searchText length] == 0){
[displayItems removeAllObjects];
[displayItems addObjectsFromArray:datas];
}else{
[displayItems removeAllObjects];
for(NSString * string in datas){
NSRange r = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (r.location != NSNotFound){
[displayItems addObject:string];
}
}
}
[tableView reloadData];
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
*/
}
@end
答案 0 :(得分:8)
使用本教程iOS快速提示:使用搜索栏过滤UITableView
http://code-ninja.org/blog/2012/01/08/ios-quick-tip-filtering-a-uitableview-with-a-search-bar/
-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
if(text.length == 0)
{
isFiltered = FALSE;
}
else
{
isFiltered = true;
filteredTableData = [[NSMutableArray alloc] init];
for (Food* food in allTableData)
{
NSRange nameRange = [food.name rangeOfString:text options:NSCaseInsensitiveSearch];
NSRange descriptionRange = [food.description rangeOfString:text options:NSCaseInsensitiveSearch];
if(nameRange.location != NSNotFound || descriptionRange.location != NSNotFound)
{
[filteredTableData addObject:food];
}
}
}
[self.tableView reloadData];
}
答案 1 :(得分:1)
您可以将NSPredicate用于此功能,修改您的搜索委托方法如下
[datas release];
datas = nil;
datas = [[NSMutableArray alloc] initWithArray: displayItems];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[c] %@",[NSString stringWithFormat:@"%@*",searchBar.text]];
[datas filterUsingPredicate:predicate];
[tableView reloadData];
检查示例代码
答案 2 :(得分:1)
我同意,您需要更改cellForRowAtIndexPath
和numberOfRowsInSection
以使用displayItems
数组而不是数据数组。
同时检查您是否为搜索栏设置了UISearchBarDelegate
。
答案 3 :(得分:0)
这样做,
在头文件中声明这样的数组,
NSMutableArray *datas;
NSMutableArray *displayItems;
然后像这样更改 viewDidLoad 中的数组初始化,
datas = [[NSMutableArray alloc] initWithObjects:@"Johan", @"Paul",@"George",@"Ringo", nil];
displayItems = [[NSMutableArray alloc] initWithArray:datas];
在 cellForRowAt 方法中更改数组
cell.textLabel.text = [displayItems objectAtIndex:indexPath.row];
然后使用NSLog在 textDidChange 方法中打印搜索字符串。如果没有打印,则IBOutlet连接出现问题。如果打印,请替换此方法并查看其是否有效,
-(void)searchbar:(UISearchBar *)searchbar textDidChange:(NSString *)searchText{
if([searchText length] == 0){
}else{
[displayItems removeAllObjects];
for (int i=0; i<[datas count]; i++) {
if ([searchText hasPrefix:[datas objectAtIndex:i]]) {
[displayItems addObject:[datas objectAtIndex:i]];
} else {
}
}
}
[tableView reloadData];
}
我的排序方法并不是世界上最好的。但是试着让你的代码工作。
编辑:我认为您的代表不会触发。尝试使用此方法而不是上述方法。
- (void) searchBarSearchButtonClicked:(UISearchBar*) theSearchBar
{
if([searchBar.text length] == 0){
arrayDisplayData = arrayOriginalData;
}else{
[arrayDisplayData removeAllObjects];
for(NSString * string in arrayOriginalData){
NSRange r = [string rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];
if (r.location != NSNotFound){
[arrayDisplayData addObject:string];
}
}
}
[tblResults reloadData];
}
或者这个,
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
答案 4 :(得分:0)
您需要更改cellForRowAtIndexPath以使用displayItems数组而不是数据数组
- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";//This is the identifier in storyboard
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
cell.textLabel.text = [displayItems objectAtIndex:indexPath.row];
return cell;
}
并且还将numberOfRowsInSection更改为使用displayItems数组计数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [displayItems count];
}