UISearchBar搜索不清除旧单元格

时间:2014-10-27 16:13:31

标签: ios objective-c uitableview uisearchbar uisearchdisplaycontroller

我尝试在自定义UISearchBar中实现UITableViewController并以编程方式完成(不使用IB)。我有搜索功能工作并返回正确的字段,但它在完整列表单元格上显示搜索到的单元格:

enter image description here

enter image description here

如您所见,新搜索字段是可滚动和可选的。它只是没有移除旧的细胞。

这是我的.h文件:

@interface TestTableViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate>

@property (strong, nonatomic) NSArray *boundaries;

@end

.m文件:

#import "TestTableViewController.h"

#import "Boundary.h"

@interface TestTableViewController ()

@property (strong, nonatomic) UISearchDisplayController *searchController;
@property (strong, nonatomic) NSMutableArray *filteredBoundaries;

@end

@implementation TestTableViewController

-(instancetype) initWithStyle:(UITableViewStyle)style {
    self = [super initWithStyle:style];

    if (self) {
        self.filteredBoundaries = [NSMutableArray array];
    }

    return self;
}

-(void)viewDidLoad {
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:TRUE selector:@selector(caseInsensitiveCompare:)];
    NSArray *sortDescriptors = @[sortDescriptor];

    self.boundaries = [self.boundaries sortedArrayUsingDescriptors:sortDescriptors];

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    searchBar.delegate = self;
    searchBar.placeholder = @"Search Fields";
    searchBar.showsCancelButton = TRUE;
    self.tableView.tableHeaderView = searchBar;

    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    self.searchController.delegate = self;
    self.searchController.searchResultsDataSource = self;
    self.searchController.searchResultsDelegate = self;    
}

// ------------------------------------------------------------------------------------------------------

#pragma mark -
#pragma mark Setup Filter Data Source

-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope {
    [self.filteredBoundaries removeAllObjects];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    self.filteredBoundaries = [NSMutableArray arrayWithArray:[self.boundaries filteredArrayUsingPredicate:predicate]];
}

// ------------------------------------------------------------------------------------------------------

#pragma mark -
#pragma mark Table view data source

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return self.filteredBoundaries.count;
    }
    else {
        return self.boundaries.count;
    }
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        Boundary *boundary = [self.filteredBoundaries objectAtIndex:indexPath.row];

        cell.textLabel.text = boundary.name;
        cell.textLabel.textColor = [UIColor blackColor];
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    }
    else {
        Boundary *boundary = [self.boundaries objectAtIndex:indexPath.row];

        cell.textLabel.text = boundary.name;
        cell.textLabel.textColor = [UIColor blackColor];
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.userInteractionEnabled = TRUE;
    }

    return cell;
}

// ------------------------------------------------------------------------------------------------------

#pragma mark -
#pragma mark UISearchDisplayController Delegates

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self filterContentForSearchText:searchString scope:[[self.searchController.searchBar scopeButtonTitles] objectAtIndex:self.searchController.searchBar.selectedScopeButtonIndex]];

    return TRUE;
}

@end

我如何调用表格视图:

    TestTableViewController *tableViewController = [[TestTableViewController alloc] initWithStyle:UITableViewStylePlain];
    tableViewController.boundaries = [group.boundaries allObjects];
    tableViewController.contentSizeForViewInPopover = POPOVER_SIZE;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    navController.navigationBar.barStyle = UIBarStyleBlack;

    self.myPopoverController = [[UIPopoverController alloc] initWithContentViewController:navController];
    self.myPopoverController.delegate = self;

    [self.myPopoverController presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

任何想法我可能做错了什么或错过了什么?

4 个答案:

答案 0 :(得分:0)

问题是UISearchDisplayController正在使用另一个UITableView而不是视图控制器自己的tableView。您可以在-tableView:cellForRowAtIndexPath:中记录UISearchBar来验证这一点。

您可以使用UISearchDisplayController而不是UISearchDisplayController来更好地控制搜索和显示逻辑。

此外,如果您的应用不支持iOS 8之前的任何版本,请考虑使用UISearchController。我没有尝试过,但它似乎给了你更多的控制权。在iOS 8中已弃用sample {{1}}。

答案 1 :(得分:0)

试试这个

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

我希望对你有所帮助

答案 2 :(得分:0)

您应该实现正确的数据源。

首先为过滤后的数据创建新的项目数组。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger count = ([filteredItems count] > 0) ? [filteredItems count] : [self.allItems count];

    return count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier: @"id"];

    MyCustomItem *item = ([filteredItems count] > 0) ? filteredItems[indexPath.row] : self.allItems[indexPath.row];

    [self configureCell:cell forItem:item];

    return cell;
}

配置搜索:

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{

    NSString *searchText = searchController.searchBar.text;

    if ([searchText length] == 0)
    {
        [filteredItems removeAllObjects];
        [self.tableView reloadData];
        return;
    }

    NSMutableArray *searchResults = [self.allItems mutableCopy];

    // SKIP ALL BODY OF SEARCHING

    filteredPeoples = searchResults;
    [self.tableView reloadData];
}

会很漂亮。

答案 3 :(得分:0)

IOS 8委托已被弃用,不确定是否存在问题。 方法

这里是[链接] https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UISearchDisplayDelegate_Protocol/index.html#//apple_ref/occ/intfm/UISearchDisplayDelegate/searchDisplayControS 8委托已弃用,不确定是否存在问题。 方法

尝试此属性

@property(nonatomic, assign) id< UISearchResultsUpdating > searchResultsUpdater

另一个更好的链接[链接] https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Listings/TableSearch_obj_c_TableSearch_APLResultsTableController_m.html