1

私は客観的 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

@Arizah-UItableviewおよびUItextFieldデリゲートメソッドをテストするための新しいアプリを作成してみてください。それはどこかであるかもしれません-

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

次のようなデリゲートメソッドがないために呼び出されます。

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

呼び出されません。このコードは避けてください。

self.autocompleteUrls = [[NSMutableArray alloc] init]; また、 retainプロパティは割り当てを必要としないため、次のステートメントは技術的に正しくありません。代わりに、次を使用できます。

NSMutableArray *theArray= [[NSMutableArray alloc] init];
self.autocompleteUrls = theArray;
[theArray release];
于 2012-11-16T12:00:47.537 に答える
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 に答える
-2

試しましたか:

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