未调用UISearchDisplayController委托方法

时间:2013-12-11 20:43:14

标签: ios delegates uisearchdisplaycontroller

我正在尝试获取有关UISearchDisplayController的一些知识,并通过示例进行一些教程,我已准备好下面的类,其中包含搜索栏和带有数据的表视图。

标题文件:

#import <UIKit/UIKit.h>    
@interface MyClass : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate, UISearchBarDelegate>    
@property (nonatomic, strong) IBOutlet UITableView *suggestionsTableView;
@property (nonatomic, strong) IBOutlet UISearchBar *searchBar;
@end

实施文件:

#import "MyClass.h"

@interface DVWNoteTypeSuggestionDisplayController ()
@property (nonatomic, strong) NSArray *items;
@property (nonatomic)BOOL isSearching;
@property (nonatomic, strong) NSMutableArray *filteredList;
@end

@implementation MyClass

- (id)init
{
    self = [super initWithNibName:@"SuggestionDisplayController" bundle:BUNDLE];

    if (self)
    {
        // Set the title.
        self.title = @"test";
    }

    return self;
}


- (void)viewDidLoad
{
self.searchBar = [[UISearchBar alloc] init];
    [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    self.searchDisplayController.searchResultsDelegate = self;
    self.searchDisplayController.searchResultsDataSource = self;
    self.searchDisplayController.delegate = self;
    self.searchBar.frame = CGRectMake(0, 0, 0, 38);
    self.suggestionsTableView.tableHeaderView = self.searchBar;

    self.items = [[NSArray alloc] initWithObjects:@"Item No. 1", @"Item No. 2", @"Item No. 3", @"Item No. 4", @"Item No. 5", @"Item No. 6", nil];
    self.isSearching = NO;
    self.filteredList = [[NSMutableArray alloc] init];
}

#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.
//    // Usually the number of items in your array (the one that holds your list)
//    return [self.items count];
//}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    if (self.isSearching)
    {
        //If the user is searching, use the list in our filteredList array.
        return [self.filteredList count];
    } else
    {
        return [self.items count];
    }
}

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    //Where we configure the cell in each row
//    
//    static NSString *CellIdentifier = @"Cell";
//    UITableViewCell *cell;
//    
//    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//    if (cell == nil) {
//        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//    }
//    // Configure the cell... setting the text of our cell's label
//    cell.textLabel.text = [self.items objectAtIndex:indexPath.row];
//    return cell;
//}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    NSString *title;
    if (self.isSearching && [self.filteredList count]) {
        //If the user is searching, use the list in our filteredList array.
        title = [self.filteredList objectAtIndex:indexPath.row];
    } else
    {
        title = [self.items objectAtIndex:indexPath.row];
    }

    cell.textLabel.text = title;

    return cell;
}

- (void)filterListForSearchText:(NSString *)searchText
{
    [self.filteredList removeAllObjects]; //clears the array from all the string objects it might contain from the previous searches

    for (NSString *title in self.items) {
        NSRange nameRange = [title rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (nameRange.location != NSNotFound) {
            [self.filteredList addObject:title];
        }
    }
}

#pragma mark - UISearchDisplayControllerDelegate

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    //When the user taps the search bar, this means that the controller will begin searching.
    self.isSearching = YES;
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    //When the user taps the Cancel Button, or anywhere aside from the view.
    self.isSearching = NO;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterListForSearchText:searchString]; // The method we made in step 7

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterListForSearchText:[self.searchDisplayController.searchBar text]]; // The method we made in step 7

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

@end

每当我尝试搜索数据集中的任何项目时(例如:“项目编号5”),它就不会在任何代表上遇到断点,即实际上搜索不起作用。请告诉我在这里缺少什么,因为这只是我现在的学习项目。

2 个答案:

答案 0 :(得分:1)

看起来以这种方式以编程方式创建的UISearchDisplayController过早地将代理置零,即使视图控制器按预期保留UISearchDisplayController

将以下内容添加到viewDidLoad的末尾,您将看到第一个日志将是有效对象,但第二个日志将为null。

  

NSLog(@“Delegate应该是%@”,self.searchDisplayController.delegate);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSLog(@"Delegate is %@", self.searchDisplayController.delegate);
});

我发现解决此问题的最快方法是通过私有财产或ivar存储您对UISearchDisplayController的引用。

答案 1 :(得分:0)

如果您必须为搜索栏控制器创建对象并将delegate搜索栏设置为其工作。

UISearchBar *searchBar = [[UISearchBar alloc] init];
[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchDisplayController.searchResultsDelegate = self;         
self.searchDisplayController.searchResultsDataSource = self;
self.searchDisplayController.delegate = self;
searchBar.frame = CGRectMake(0, 0, 0, 38);
self.tableView.tableHeaderView = searchBar;