如何在iOS中搜索tableview内容?

时间:2014-10-28 09:35:55

标签: ios uitableview xcode6 uisearchbar

我正在显示我的表格视图中的内容列表现在我想使用uisearchbar搜索该列表内容我实现了此代码但它不起作用。

     -(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];
         self.navigationItem.title=@"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];
      }

       }

// ********* this 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 *CellIdentifier=@"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;
      }

3 个答案:

答案 0 :(得分: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];
}

我希望对你有所帮助

答案 1 :(得分:0)

它不起作用,因为您始终将此作为数据源使用:

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

所以你永远不会从filteredContentList中获取数据。

您需要做的是在属性中保留对主UITableView的引用,并使用此方法将属性NSArray作为所有UITableViewDataSource委托方法中的数据源:

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

答案 2 :(得分: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];}