ipad: интеллектуальный поиск в поповере - PullRequest
1 голос
/ 02 марта 2011

Я хочу реализовать это

1), когда пользователь начинает вводить текстовое поле, всплывающее окно вспыхивает и показывает список элементов в табличном представлении в всплывающем окне в соответствии со строкой, введенной в текстовое поле.

2) Кроме того, эти данные должны обновляться при каждом вводе новой буквы.

вид интеллектуального поиска.

Пожалуйста, помогите мне с этим и предложите возможные способы реализации этого.

Ответы [ 2 ]

7 голосов
/ 02 марта 2011

UISearchDisplayController выполняет большую часть тяжелой работы за вас.

Поместите UISearchBar (не UITextField) в вашем представлении и подключите к нему UISearchDisplayController..

// ProductViewController.h
@property IBOutlet UISearchBar *searchBar;
@property ProductSearchController *searchController;

// ProductViewController.m
- (void) viewDidLoad
{
    [super viewDidLoad];

    searchBar.placeholder = @"Search products";
    searchBar.showsCancelButton = YES;

    self.searchController = [[[ProductSearchController alloc]
                                    initWithSearchBar:searchBar
                                    contentsController:self] autorelease];
}

Я обычно подкласс UISearchDisplayController, и это его собственный делегат, searchResultsDataSource и searchResultsDelegate.Последние два управляют таблицей результатов обычным образом.

// ProductSearchController.h
@interface ProductSearchController : UISearchDisplayController
            <UISearchDisplayDelegate, UITableViewDelegate, UITableViewDataSource>

// ProductSearchController.m
- (id)initWithSearchBar:(UISearchBar *)searchBar
                contentsController:(UIViewController *)viewController
{
    self = [super initWithSearchBar:searchBar contentsController:viewController];

    self.contents = [[NSMutableArray new] autorelease];
    self.delegate = self;
    self.searchResultsDataSource = self;
    self.searchResultsDelegate = self;

    return self;
}

Каждое нажатие клавиши на панели поиска вызывает searchDisplayController:shouldReloadTableForSearchString:.Быстрый поиск может быть реализован прямо здесь.

- (BOOL) searchDisplayController:(UISearchDisplayController*)controller
            shouldReloadTableForSearchString:(NSString*)searchString
{
    // perform search and update self.contents (on main thread)
    return YES;
}

Если ваш поиск может занять некоторое время, сделайте это в фоновом режиме с помощью NSOperationQueue .В моем примере ProductSearchOperation будет вызывать showSearchResult:, когда и если он завершится.

// ProductSearchController.h
@property INSOperationQueue *searchQueue;

// ProductSearchController.m
- (BOOL) searchDisplayController:(UISearchDisplayController*)controller
        shouldReloadTableForSearchString:(NSString*)searchString
{
    if (!searchQueue) {
        self.searchQueue = [[NSOperationQueue new] autorelease];
        searchQueue.maxConcurrentOperationCount = 1;
    }

    [searchQueue cancelAllOperations];
    NSInvocationOperation *op = [[[ProductSearchOperation alloc]
            initWithController:self
            searchTerm:searchString] autorelease];
    [searchQueue addOperation:op];

    return NO;
}

- (void) showSearchResult:(NSMutableArray*)result
{
    self.contents = result;
    [self.searchResultsTableView
            performSelectorOnMainThread:@selector(reloadData)
            withObject:nil waitUntilDone:NO];
}
1 голос
/ 02 марта 2011

Похоже, у вас уже есть хорошее представление о реализации.Мое предложение состояло бы в том, чтобы представить UITableView во всплывающем окне с панелью поиска вверху, а затем просто управлять источником данных табличного представления, используя поисковый термин, и вызывать reloadData в табличном представлении каждый раз, когда пользователь вводит в поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...