2014-10-28 149 views
1

我在我的表格视图中显示内容列表现在我想使用uisearchbar搜索列表内容我实现了这个代码,但它不工作。 。如何在iOS中搜索tableview内容?

 -(void)SearchBarCode 

    { self.disableViewOverlay = [[UIView 
     alloc]initWithFrame:CGRectMake(0.0f,44.0f,320.0f,0)]; 
     self.disableViewOverlay.backgroundColor=[UIColor lightGrayColor]; 
     self.disableViewOverlay.alpha = 0; 

     theSearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 5, 374.0f, 
     50)]; 
     theSearchBar.delegate =self; 
     [self.tableView addSubview:theSearchBar]; 
     [email protected]"SMS LIST"; 

     [[self tableView] setTableHeaderView:theSearchBar]; 

      } 

     - (void)viewDidAppear:(BOOL)animated 
     { 
    [super viewDidAppear:animated]; 
    [self.theSearchBar resignFirstResponder]; 
     } 


    - (void) dismissKeyboard 
    { 
     [self.theSearchBar becomeFirstResponder]; 
    } 


    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
    { 
     [theSearchBar setShowsCancelButton:YES animated:YES]; 

    } 
    -(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
    { 
     [theSearchBar resignFirstResponder]; 
     [self.view endEditing:YES]; 

    } 
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
     { 



     [theSearchBar setShowsCancelButton: YES animated: YES]; 
    // [ self:filteredContentList]; 
     if (!theSearchBar.text || self.theSearchBar.text.length < 1) 
     { 
    [searchBar resignFirstResponder]; 
     } 

     } 

// *********此textDidchange方法*********************

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 

    { 

    NSString *searchString =searchBar.text; 
    filteredContentList = [[NSMutableArray alloc]init]; 
    [filteredContentList removeAllObjects]; 
    for (SmsTitle *title in array) 
    { 
    NSString *tempStr = title.Title; 
    NSComparisonResult result = [tempStr compare:searchString options: 
    (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, 
    [searchString length])]; 

    if (result == NSOrderedSame) 
    { 

     [filteredContentList addObject:title]; 
    } 
    } 
    [self searchBarSearchButtonClicked:searchBar]; 
    } 



    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
    { 
    theSearchBar.text=nil; 
    [theSearchBar setShowsCancelButton:NO animated:YES]; 
    [theSearchBar resignFirstResponder]; 
    } 

    - (void)searchBar:(UISearchBar *)searchBar activate:(BOOL) active 
    { 
    self.theTableView.allowsSelection = !active; 
    self.theTableView.scrollEnabled = !active; 

    if (!active) 
    { 

    [disableViewOverlay removeFromSuperview]; 
    [searchBar resignFirstResponder]; 
    } 
    else 
    { 
    self.disableViewOverlay.alpha = 0; 
    [self.view addSubview:self.disableViewOverlay]; 

    [UIView beginAnimations:@"FadeIn" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    self.disableViewOverlay.alpha = 0.6; 
    [UIView commitAnimations]; 

    // probably not needed if you have a details view since you 
    // will go there on selection 
    NSIndexPath *selected = [self.theTableView indexPathForSelectedRow]; 
    if (selected) 
    { 
     [self.theTableView deselectRowAtIndexPath:selected 
             animated:NO]; 
    } 
    } 
    [searchBar setShowsCancelButton:active animated:YES]; 
    } 



    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 

    [self.view endEditing:YES]; 
    [self.theSearchBar resignFirstResponder]; 
    } 
    -(BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
    textField.returnKeyType=UIReturnKeyDefault ; 
    return[textField resignFirstResponder]; 
    } 


- (void)didReceiveMemoryWarning 
    { 
    [super didReceiveMemoryWarning]; 
    } 

    #pragma mark - Table view data source 

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    { 
    return 1; 
    } 

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: 
    (NSInteger)section 
    { 
    return [array count]; 
} 


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
     (NSIndexPath *)indexPath 
    { 

    static NSString *[email protected]"Cell"; 
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier 
     ]; 

    if(!cell) 
    { 


     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
    reuseIdentifier:CellIdentifier] ; 
     } 


     SmsTitle *title = [array objectAtIndex:indexPath.row]; 

    cell.textLabel.text = title.CategoryId; 
     cell.textLabel.text = title.Title; 
     cell.textLabel.text=title.Id; 


     [cell.textLabel setText:[NSString stringWithFormat:@"%@ ",[title 
    valueForKey:@"Title"]]]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
     } 
+0

调试代码,并检查执行或不委托方法?如果它没有执行,那么你不会执行搜索栏协议​​@interface ViewController() Janmenjaya 2014-10-28 09:57:50

+0

@Chetan Gharat你得到了什么错误? – 2014-10-28 11:51:41

回答

3

试试这个

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 41.0)]; 
    [self.view addSubview:searchBar]; 
    searchBar.delegate=self; 

- (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. 
    if (isSearching) { 
     return [filteredContentList count]; 
    } 
    else { 
     return [titlearray count]; 
    } 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"SimpleTableCell"; 

    SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 
    if (isSearching) 
    { 
     cell.nameLabel.text = [filteredContentList objectAtIndex:indexPath.row]; 
     cell.thumbnailImageView.image =[filteredImgArray objectAtIndex:indexPath.row]; 
    } 
    else 
    { 
     cell.thumbnailImageView.image = [imagearray objectAtIndex:indexPath.row]; 
     cell.nameLabel.text = [titlearray objectAtIndex:indexPath.row]; 
    } 
    return cell; 
} 
- (void)searchTableList { 
    NSString *searchString = searchBar.text; 

    for (int i=0; i<titlearray.count; i++) { 
     NSString *tempStr=[titlearray objectAtIndex:i]; 
     NSComparisonResult result = [tempStr compare:searchString options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchString length])]; 
     if (result == NSOrderedSame) 
     { 
      [filteredContentList addObject:tempStr]; 
      [filteredImgArray addObject:[imagearray objectAtIndex:i]]; 
     } 
    } 

} 

#pragma mark - Search Implementation 

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    isSearching = YES; 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
    NSLog(@"Text change - %d",isSearching); 

    //Remove all objects first. 
    [filteredContentList removeAllObjects]; 
    [filteredImgArray removeAllObjects]; 

    if([searchText length] != 0) { 
     isSearching = YES; 
     [self searchTableList]; 
     //tblContentList.hidden=NO; 
    } 
    else { 
     isSearching = NO; 
     // tblContentList.hidden=YES; 
    } 
    [tblContentList reloadData]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    NSLog(@"Cancel clicked"); 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    NSLog(@"Search Clicked"); 
    [self searchTableList]; 
} 

我希望它对你有帮助

+0

我会检查这2maro和接受你的答案感谢兄弟帮助 – 2014-10-28 14:29:12

+0

其工作谢谢 – 2014-10-29 04:26:34

+0

@ChetanGharat美好的一天 – 2014-10-29 04:30:01

0

SmsTitle *title = [array objectAtIndex:indexPath.row]; 

所以,你永远不能摆脱filteredContentList数据:因为你总是用这个作为数据源不起作用。

你需要做的就是保持参照主要的UITableView的属性,并使用这种方法来获得PROPERT的NSArray在所有UITableViewDataSource委托方法数据来源:

- (NSArray*) dataSourceForTableView:(UITableView*) tableView 
{ 
    return tableView == self.tableView ? self.array : self.filteredContentList; 
} 
+0

我已经实施 2014-10-28 10:01:17

+0

是的,但有什么问题给我的解决方案 – 2014-10-28 10:01:54

+0

没有它的不工作 – 2014-10-28 10:08:17

0

查看加载

allItem = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",@"Six", nil]; 

displayItem = [[NSMutableArray alloc] initWithArray:allItem]; 

增加这个搜索栏方法只

-(void)searchBar:(UISearchBar *) searchBar textDidChange:(NSString *)searchText 

{ 
if ([searchText length] == 0) 
{ 
    [displayItem removeAllObjects]; 
    [displayItem addObjectsFromArray:allItem]; 
} 
else 
{ 
    [displayItem removeAllObjects]; 

    for (NSString *string in allItem) 
    { 
     NSRange r = [string rangeOfString:searchText options:NSCaseInsensitiveSearch]; 

     if (r.location != NSNotFound) 
     { 
      [displayItem addObject:string]; 
     } 
    } 

} 
[tableViewObj reloadData]; 

}

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
[searchBar resignFirstResponder];}