我正在研究一个学生项目。
此时我们的应用程序可以调用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];
}
感谢您的时间! :)
答案 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]);
输出什么?