7

私はiOSプログラミングが初めてで、Google検索ボックス、つまりテキストフィールドの自動入力などを実装する必要があります。私のシナリオは次のとおりです1.ユーザーがテキストフィールドに入力するとき2.データのWebサービスへのバックグラウンド呼び出し(リクエストデータ=テキストフィールドデータ)。

例:- ユーザーがテキスト フィールドに「abc」と入力した場合、Web サービス呼び出しの要求データは「abc」である必要があり、Web サービスはそれに対する応答を返します。次回ユーザーが「d」と入力すると、つまりテキストフィールドに「abcd」が含まれる場合、サービス応答は追加されたテキストを考慮する必要があります ( Google 検索フィールドのようなもの)。4.レスポンスがドロップダウンリストに表示されます。

それはiosで可能ですか?チュートリアルや例をいただければ幸いです。前もって感謝します。

4

1 に答える 1

4

神への愛のために、SOAPではなくRestful Webサービスについて話していると思います!

はい、もちろん可能です。このアプローチに従うことができます。AFNetworkingなどの HTTP ライブラリを使用してリクエストを行うこともできますが、簡単にするために、バックグラウンドで URL の内容を使用して NSData を初期化し、メインスレッドでGCDを使用して UI を更新しています。

  1. viewDidLoad:メソッドで作業しているViewControllerにUITextFieldデリゲートを設定します

    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 リクエストを作成できますlength % 3

それらについて何か読むことをお勧めします

于 2012-11-28T16:17:52.110 に答える