Ios 我能';无法使用UISearchBar控件在UITableView上进行搜索
我无法在UITableView上进行搜索。我已在UITableViewController h文件中声明了委托等:Ios 我能';无法使用UISearchBar控件在UITableView上进行搜索,ios,ios5,Ios,Ios5,我无法在UITableView上进行搜索。我已在UITableViewController h文件中声明了委托等: @protocol searchTanksListDelegate - (void) searchTanksList:(UISearchBar *) sender textDidChange:(NSString *) searchText; @end @property (weak, nonatomic) id <searchTanksListDelegate> se
@protocol searchTanksListDelegate
- (void) searchTanksList:(UISearchBar *) sender textDidChange:(NSString *) searchText;
@end
@property (weak, nonatomic) id <searchTanksListDelegate> searchDelegate;
@property (weak, nonatomic) IBOutlet UISearchBar *searchTanksList;
属性已经被合成等-因此代码编译没有错误或警告。。。但是,当我键入时,不会调用textDidChange方法 您只需将搜索栏声明为属性,并确保将该类设置为
UISearchBarDelegate
。然后使用委托方法:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
以处理搜索。如果你需要,我可以给你一个完整的例子
假设您正在筛选的是一个数组的示例:
#pragma mark - SearchBar Delegate Methods
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[self filterContentForSearchText:searchText];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
searchBar.text = @"";
workingTableViewData = [[NSMutableArray alloc] initWithArray:originalTableViewData];
[self.myTableView reloadData];
[searchBar resignFirstResponder];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
}
- (void)filterContentForSearchText:(NSString *)searchText
{
if (searchText && searchText.length) {
[self.workingTableViewData removeAllObjects];
for (NSDictionary *dictionary in originalTableViewData)
{
for (NSString *thisKey in [dictionary allKeys]) {
if ([thisKey isEqualToString:@"Key1"] ||
[thisKey isEqualToString:@"Key2"]) {
if ([[dictionary valueForKey:thisKey] rangeOfString:searchText options:NSCaseInsensitiveSearch].location != NSNotFound) {
[workingTableViewData addObject:dictionary];
}
} // if ([thisKey isEqualToString:@"Key1"] || [thisKey isEqualToString:@"Key2"])
} // for (NSString *thisKey in [dictionary allKeys])
} // for (NSDictionary *dictionary in originalTableViewData)
[self.myTableView reloadData];
} // if (searchText && searchText.length)
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self filterContentForSearchText:searchBar.text];
[searchBar resignFirstResponder];
}
注意-workingTableViewData和originalTableViewData都是私有属性。originalTableViewData是一个NSArray,workingTableViewData是一个NSMutableArray。您应该将搜索栏声明为一个属性,并确保该类设置为一个
UISearchBarDeleteGate
。然后使用委托方法:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
以处理搜索。如果你需要,我可以给你一个完整的例子
假设您正在筛选的是一个数组的示例:
#pragma mark - SearchBar Delegate Methods
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[self filterContentForSearchText:searchText];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
searchBar.text = @"";
workingTableViewData = [[NSMutableArray alloc] initWithArray:originalTableViewData];
[self.myTableView reloadData];
[searchBar resignFirstResponder];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
}
- (void)filterContentForSearchText:(NSString *)searchText
{
if (searchText && searchText.length) {
[self.workingTableViewData removeAllObjects];
for (NSDictionary *dictionary in originalTableViewData)
{
for (NSString *thisKey in [dictionary allKeys]) {
if ([thisKey isEqualToString:@"Key1"] ||
[thisKey isEqualToString:@"Key2"]) {
if ([[dictionary valueForKey:thisKey] rangeOfString:searchText options:NSCaseInsensitiveSearch].location != NSNotFound) {
[workingTableViewData addObject:dictionary];
}
} // if ([thisKey isEqualToString:@"Key1"] || [thisKey isEqualToString:@"Key2"])
} // for (NSString *thisKey in [dictionary allKeys])
} // for (NSDictionary *dictionary in originalTableViewData)
[self.myTableView reloadData];
} // if (searchText && searchText.length)
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[self filterContentForSearchText:searchBar.text];
[searchBar resignFirstResponder];
}
注意-workingTableViewData和originalTableViewData都是私有属性。originalTableViewData是一个NSArray,workingTableViewData是一个NSMutableArray。我不明白为什么人们在声明时不遵守NSObject的协议……对不起,我是objective c/ios开发新手,不明白你在说什么,也不明白它在这里对我有什么帮助……:o) 应该是这样的:
@protocol searchTanksListDelegate
我已经改变了,但它仍然不起作用。我不明白为什么人们在声明时不将他们的协议与NSObject一致……对不起,我是objective c/ios开发的新手,不明白你在说什么,也不明白它如何帮助我……:o) 应该是这样的:@protocol searchTanksListDelegate
我已经更改了,但仍然不起作用。Briliant-谢谢。我对在哪里声明委托、协议等有点困惑。我已经撕下了其中的大部分,现在它可以按照我想要的方式工作了!:o) 谢谢。@ElJay方法filterContentForSearchText:
必须使用中央调度,对吗?或者必须在搜索栏:textDidChange:
方法中实现GCD构造?或者这没关系,在哪里使用它,唯一的目的是避免主线程?你太棒了。最简单的故障最终解决了我们的情况。一个问题:我们如何阻止搜索结果弹出整个TableView来占据整个屏幕?我们有一个搜索栏和Table VIEW有点向下的视图,一旦你键入搜索,TabelVIEW弹出,以覆盖整个屏幕(搜索栏仍然在屏幕中部的地方)?谢谢谢谢你。我对在哪里声明委托、协议等有点困惑。我已经撕下了其中的大部分,现在它可以按照我想要的方式工作了!:o) 谢谢。@ElJay方法filterContentForSearchText:
必须使用中央调度,对吗?或者必须在搜索栏:textDidChange:
方法中实现GCD构造?或者这没关系,在哪里使用它,唯一的目的是避免主线程?你太棒了。最简单的故障最终解决了我们的情况。一个问题:我们如何阻止搜索结果弹出整个TableView来占据整个屏幕?我们有一个搜索栏和Table VIEW有点向下的视图,一旦你键入搜索,TabelVIEW弹出,以覆盖整个屏幕(搜索栏仍然在屏幕中部的地方)?谢谢