1

我对 Objective-C 和实现 UItextField 的自动完成功能的概念相当陌生。我可以适当地做到这一点。但是当我选择一个特定的单元格时,该单元格的文本应该显示在 UITextField 中,并且相应的 tableView 必须被隐藏。但是我选择单元格后无法隐藏 UITableView ..我哪里出错了?

- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring {


    NSURL *urlString= [NSString stringWithFormat:@"http://179.87.89.90/services/Service.svc/GetCities/?p=%@&k=%@",substring,txtId.text];     
    NSURL *jsonUrl =[NSURL URLWithString:urlString];
    NSString *jsonStr = [[NSString alloc] initWithContentsOfURL:jsonUrl];  
    parser = [[NSXMLParser alloc] initWithContentsOfURL:jsonUrl];
    currentHTMLElement=@"3";
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    [parser release];
    NSLog(@"%@",arr2);



    if([arr2 count]!=0)
    {
        self.autocompleteUrls = [[NSMutableArray alloc] init];

        autocompleteTableView = [[UITableView alloc] initWithFrame:CGRectMake(88, 447, 200, 120) style:UITableViewStyleGrouped];
        autocompleteTableView.delegate = self;
        autocompleteTableView.dataSource = self;
        autocompleteTableView.scrollEnabled = YES;
        // autocompleteTableView.hidden = YES;  
        [self.view addSubview:autocompleteTableView];
        [autocompleteUrls removeAllObjects];
            for(int i=0;i<[arr2 count];i++)
            {
                NSString *curString = [[arr2 objectAtIndex:i] valueForKey:@"Name"];

                NSRange substringRange = [curString rangeOfString:substring];

                if (substringRange.location == 0) 
                    [autocompleteUrls addObject:curString];  

            }
      [autocompleteTableView reloadData];
    }
    else
    {
        autocompleteTableView.delegate=nil;
        autocompleteTableView.dataSource=nil;
        autocompleteTableView.hidden = YES;  

    }

}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {



    if( textField == txtcity)
    {
     autocompleteTableView.hidden = NO;
    NSString *substring = [NSString stringWithString:textField.text];
    substring = [substring stringByReplacingCharactersInRange:range withString:string];
    [self searchAutocompleteEntriesWithSubstring:substring];
    return YES;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section {
    return autocompleteUrls.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = nil;
    static NSString *AutoCompleteRowIdentifier = @"AutoCompleteRowIdentifier";
    cell = [tableView dequeueReusableCellWithIdentifier:AutoCompleteRowIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                 initWithStyle:UITableViewCellStyleDefault reuseIdentifier:AutoCompleteRowIdentifier] autorelease];
    }

    cell.textLabel.text = [autocompleteUrls objectAtIndex:indexPath.row];
    cell.textLabel.font=[UIFont boldSystemFontOfSize:12];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
    txtcity.text = selectedCell.textLabel.text;
    [autocompleteUrls removeAllObjects];
    [self.autocompleteTableView setHidden:YES];    
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
        txtcity.text = selectedCell.textLabel.text;
        [autocompleteUrls removeAllObjects];
        autocompleteTableView.hidden=YES;

    }

选择一行后如何隐藏 autocompleteTableView ?任何帮助,将不胜感激..

4

3 回答 3

0

问题在于 if 条件,当if评估为 true 时,autocompleteTableView再次分配并添加到 self.view。它将被放置在前一个 tableView 上,您将失去前一个 tableView 的引用。如果你打电话autocompleteTableView.hidden = YES。最后添加tableView的将被隐藏。但是之前添加的 tableViews 会在那里。

只需将 if 块更改为:

if([arr2 count]!=0)
{
    self.autocompleteUrls = [[NSMutableArray alloc] init];
    if(autocompleteTableView)
         [autocompleteTableView removeFromSuperView];
    autocompleteTableView = [[UITableView alloc] initWithFrame:CGRectMake(88, 447, 200, 120) style:UITableViewStyleGrouped];
    autocompleteTableView.delegate = self;
    autocompleteTableView.dataSource = self;
    autocompleteTableView.scrollEnabled = YES;
    // autocompleteTableView.hidden = YES;  
    [self.view addSubview:autocompleteTableView];
        for(int i=0;i<[arr2 count];i++)
        {
            NSString *curString = [[arr2 objectAtIndex:i] valueForKey:@"Name"];

            NSRange substringRange = [curString rangeOfString:substring];

            if (substringRange.location == 0) 
                [autocompleteUrls addObject:curString];  

        }
  [autocompleteTableView reloadData];
}
于 2012-11-16T11:00:53.237 回答
0

@Arizah - 请尝试制作一个新的应用程序来测试 UItableview 和 UItextField 委托方法。可能在某个地方——

autocompleteTableView.delegate=nil;
autocompleteTableView.dataSource=nil;

被调用,因为进一步没有委托方法,如:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

不会被调用。尝试避免此代码。

另外声明:self.autocompleteUrls = [[NSMutableArray alloc] init]; 在技术上是不正确的,因为保留属性不需要分配。相反,您可以使用:

NSMutableArray *theArray= [[NSMutableArray alloc] init];
self.autocompleteUrls = theArray;
[theArray release];
于 2012-11-16T12:00:47.537 回答
-2

你试过了吗:

[self.tableView setHidden:YES];
于 2012-11-16T10:42:50.863 回答