7

我是 ios 编程的新手,需要实现类似谷歌搜索框的东西,即自动填充文本字段。我的场景如下 1.当用户在文本字段中输入 2.后台调用 web 服务获取数据(请求数据 = 文本字段数据)。

例如:- 如果用户在文本字段中键入“abc”,则 Web 服务调用的请求数据应为“abc”,并且 Web 服务会对此做出响应。现在下次用户键入“d”即文本字段包含“abcd”服务响应时必须考虑附加文本。(类似于谷歌搜索字段) 3.web 服务调用应该是异步的。4.response应该显示在下拉列表中。

ios可以吗???任何教程或示例将不胜感激。提前致谢。

4

1 回答 1

4

看在上帝的份上,我会假设您正在谈论的是 Restful Web 服务而不是 SOAP!

是的,当然有可能。您可以采用这种方法,我可以使用诸如AFNetworking之类的 HTTP 库来发出请求,但为了简单起见,我只是在后台使用 URL 的内容初始化 NSData 并使用GCD在主线程上更新 UI 。

  1. 将您的 UITextField 委托设置为您正在处理的 ViewControllerviewDidLoad:方法

    textField.delegate = self;
    
  2. 覆盖UITextField委托方法textField:shouldChangeCharactersInRange:replacementString:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
        // To increase performance I advise you to only make the http request on a string bigger than 3,4 chars, and only invoke it
        if( textField.text.length + string.length - range.length > 3) // lets say 3 chars mininum
        {
            // call an asynchronous HTTP request
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
                NSURL * url = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"http:/example.com/search?q=%@", textField.text]];
                NSData * results = [NSData dataWithContentsOfURL:url];
                NSArray * parsedResults = [NSJSONSerialization JSONObjectWithData: results options: NSJSONReadingMutableContainers error: nil];
               // TODO: with this NSData, you can parse your values - XML/JSON
               dispatch_sync(dispatch_get_main_queue(), ^{
                   // TODO: And update your UI on the main thread
                   // let's say you update an array with the results and reload your UITableView
                   self.resultsArrayForTable = parsedResults;
                   [tableView reloadData];
               });
            });
    
        }
    
        return YES; // this is the default return, means "Yes, you can append that char that you are writing
        // you can limit the field size here by returning NO when a limit is reached
    }
    

如您所见,您需要习惯以下概念列表:

  • JSON 解析(我可以解析 XML,但为什么呢?! JSON 更好!)
  • HTTP 请求(您可以使用 AFNetworking 而不是我上面所做的)
  • 异步 HTTP 请求(不阻塞主线程)
  • GCD(dispatch_async东西)
  • 代表(在本例中为 UITextField)

性能更新

  • 在检查大小是否大于 3 个字符时,您甚至可以每 2/3 个字符发出一次 HTTP 请求,比方说,只请求 if length % 3

我建议你读一些关于那些的

于 2012-11-28T16:17:52.110 回答