2012-04-26 4 views
6

Я хочу создать searchBar для моей таблицы в раскадровке xcode, все работает для меня, и у меня нет никакой ошибки, просто поиск не работает.UISearchBar в раскадровке Xcode

Я видел это два учебника, но все еще не работает. Я не могу поискать. мой учебник:

-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

ли это так,

  • В файле заголовка объявлять массивы как это,

    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]; 
    
  • Затем распечатайте Ваш поиск строка внутри textDidChange способ используя NSLog. Если это не печать, что-то не так с соединением 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 
+0

Спасибо за ваш ответ, но по-прежнему не работает! –

+0

Отображает ли ваш табличный стол данные, которые вы положили, когда вы запускаете приложение ?. Я имею в виду эти, "datas = [NSMutableArray arrayWithObjects: @" Johan ", @" Paul ", @" George ", @" Ringo ", nil];" –

+0

да, это показывает их. –

0

Вы должны изменить вы cellForRowAtIndexPath использовать массив displayItems вместо массива DATAS

- (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]; 
} 
+0

Спасибо, но ничего не произошло –

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]; 

проверки образец кода здесь

http://dl.dropbox.com/u/58723521/SearchSample.zip

+0

У меня была ошибка с этой стороны, searchBar.text] –

+0

Я проверю ссылку –

+0

Возможно, вы использовали другой экземпляр UISearchBar, замените его на это имя. – vishy

1

Я согласен, что вам нужно изменить cellForRowAtIndexPath и numberOfRowsInSection к используйте массив displayItems, а не массив данных. Также проверьте, установлен ли для вашей панели поиска UISearchBarDelegate.

8

Используйте этот учебник IOS Quick Tip: Фильтрация 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]; 
} 
+0

Что делать, если у вас есть разделы в таблице? Как искать работу, зная, что вы будете искать внутри содержимого разделов вместо одного массива? – jaytrixz

+0

jaytrixz, вы можете найти мой другой учебник по фильтрации объединенного UITableView полезного. Он использует словарь массивов вместо одного массива. http://code-ninja.org/blog/2012/07/04/filtering-a-grouped-uitableview-with-a-search-bar/ –

Смежные вопросы