每次输入一个字母时,UISearchBar都会调用API,而不是单击“搜索按钮”

时间:2012-02-01 13:31:20

标签: iphone api uitableview uisearchbar

我正在研究一个学生项目。

此时我们的应用程序可以调用API并重新加载数据,但前提是我在textDidChange中调用XMLParser。

含义:每次在UISearchBar中输入字母时,它都会正确调用和重新加载。我希望电话和重新加载仅在用户点击“搜索”按钮时发生,但在 textDidChange 中使用的相同代码在 searchBarSearchButtonClicked 中无效。

相反..该方法仅在按下搜索按钮(好)时调用API,收到与 textDidChange (好)<相同的信息/ strong>但是没有重新加载UITableView (糟糕)

我已经搜索了所有问题的答案,所以我想我会发一个问题:)

我遇到的所有示例都只显示了在用户输入(contactlist)时如何显示与用户条件匹配的数组内容,但没有显示如何使用searchbutton正确地重新加载uitableView。

为什么在委托方法

中正确重新加载相同的确切代码

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

但不在

- (void)searchBarSearchButtonClicked:(UISearchBar *)theSearchBar

正如我所说,NSLog打印出正确的数据,以便在单击searchButton时加载uitableview,因此这不是问题所在。

有人能指出我在正确的方向吗? :)

我的cellForRowAtIndexPath:

`

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *uniqueIdentifier = @"searchCell";

    SearchCell *cell = nil;

    cell = (SearchCell *) [self.tableView dequeueReusableCellWithIdentifier:uniqueIdentifier];

    if(!cell)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SearchCell" owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[SearchCell class]]) {
                cell = (SearchCell *)currentObject;
                break;
            }
        }
    }

    Search *currentSearch = [[searchxmlParser searchhits] objectAtIndex:indexPath.row];

    cell.track_label.text = [currentSearch track];
    cell.artist_label.text = [currentSearch artist];

    return cell;
}

请求的委托方法:

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

    NSString *searchurl = [NSString stringWithFormat:@"http://ws.spotify.com/search/1/track?q=%@", [self urlEncodeValue:searchText]];

    xmlParser = [[SearchXMLParser alloc] loadXMLByURL:searchurl];

    [self.tableView reloadData];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)theSearchBar {

    NSString *searchurl = [NSString stringWithFormat:@"http://ws.spotify.com/search/1/track?q=%@", [self urlEncodeValue:theSearchBar.text]];

    xmlParser = [[SearchXMLParser alloc] loadXMLByURL:searchurl];

    [self.tableView reloadData];

    [theSearchBar setShowsCancelButton:NO animated:YES];
    [theSearchBar resignFirstResponder];
}

- (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.
    return [[searchxmlParser searchhits] count];
}

感谢您的时间! :)

3 个答案:

答案 0 :(得分:2)

您应该使用UISearchDisplayController

在你的h文件中,你应该使用原始dataSource声明2个数组,使用filtredValues声明一个数组。在viewDidLoad中分配它们并在dealloc中释放。

在cellForRowAtIndexPat和umberOfRowsInSection中,你应该测试女巫tableView并显示并返回所需的值。

if(tableView == self.searchDisplayController.searchResultsTableView){
// search view population
} else {
// all data view population
}

使用此方法,您可以使用filtring dataSource数组进行实时搜索,并将值放在filtredArray中。

答案 1 :(得分:1)

您需要将自己设置为搜索栏的委托,并覆盖委托搜索栏委托searchDisplayController:shouldReloadTableForSearchString:的默认行为。

默认的实现方法是按每次按键进行搜索。您所要做的就是在方法中返回NO

- (BOOL) searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString {
        return NO;
}

答案 2 :(得分:0)

您是否正确实现了numberOfSectionsInTableView和numberOfRowsInSection?

请显示这两种方法的代码。

增加:

如果你把

NSLog(@" number of rows in section = %d", [[searchxmlParser searchhits] count]);

输出什么?