Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我能';无法使用UISearchBar控件在UITableView上进行搜索_Ios_Ios5 - Fatal编程技术网

Ios 我能';无法使用UISearchBar控件在UITableView上进行搜索

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

我无法在UITableView上进行搜索。我已在UITableViewController h文件中声明了委托等:

@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弹出,以覆盖整个屏幕(搜索栏仍然在屏幕中部的地方)?谢谢