2017-01-06 9 views
0

APIを使用してテキストフィールドをオートコンプリートしようとしています(グローバルエクイティオートコンプリート用)。 ユーザーがテキストフィールドをタップして編集を開始すると、応答のすべての配列値を含むテーブルビューが表示されます。ユーザーが最初にテキストフィールドを編集したが、後でテーブルビューのデータが変更されていないときに、テーブルビューにデータを取り込めるようになりました。 しかし私は私の配列を印刷しようとし、配列の値がUITextFieldの入力文字列に従って変化します。アレイが変更された後、Tableviewでデータをリロードできませんか?

var stockValues = [String]() 
var getStockName:String = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Intialising myCustome Table View AutocompleteStocks 

    AutocCompleteStocks.delegate = self 
    AutocCompleteStocks.dataSource = self 
    self.AutocCompleteStocks.register(UITableViewCell.self, forCellReuseIdentifier: "myCell") 
    self.AutocCompleteStocks.isHidden = true 


} 


@IBOutlet var stocksAutocomplete: UITextField! 


@IBOutlet var AutocCompleteStocks: UITableView! 


//TableView Delegate Methods 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    print("TejastockValues\(self.stockValues.count)") 
    return self.stockValues.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell") 

    cell?.textLabel?.text = self.stockValues[indexPath.row] 
    print("TejastockValues\(self.stockValues)") 
    return cell! 
} 

@IBAction func buttonPressed(_ sender: AnyObject) { 

} 

@IBOutlet var stockEntryTextField: UITextField! 

//Text Field when editing changes . I am storing the text value entered by user into getStockName variable 

@IBAction func AutoCompleteTextField(_ sender: AnyObject) { 




    self.AutocCompleteStocks.isHidden = false 

    getStockName = stockEntryTextField.text! 



    print("kichuuuuu\(getStockName)") 


    //Calling web service 

    Alamofire.request("http://search.xignite.com/Search/Suggest?parameter=XigniteGlobalQuotes.GetGlobalDelayedQuote.Identifier&term=\(getStockName)&tags=xnse").responseJSON{response in 

     if let json = response.result.value as? [String:AnyObject]{ 

      if let results = json["Results"]{ 

       print(" \(results)") 

       //looping through all the values 

       for i in 0..<results.count{ 

        let item = results[i] as! [String:AnyObject] 

        let value = item["Value"] as! String 

        self.stockValues.append(value) 

        self.AutocCompleteStocks.reloadData() 
        //reloading the tableview after appending values 



       } 
       print("TejastockValues\(self.stockValues)") 

      } 
     } 
    } 

    callingAutocomplete() 

} 


func callingAutocomplete(){         

} 
+0

まずあなたは、このように、また、ないループの反復ごとの内側のforループの後に、あなたの 'tableView'をリロードメインthread''に 'tableView'をリロードする必要がありhttp://stackoverflow.com/a/41478738/6433023 –

答えて

0

あなたはUITextフィールドに変更があったときにそれをクリアせずにstockValuesに値を追加しています。テキストフィールドの変更で

stockValues = [""]のような何かを行うと、それは意図したとおりに動作するはずです。また、Nirav Dの提案のようにメインスレッドでtableViewをリロードします。

@IBAction func AutoCompleteTextField(_ sender: AnyObject) { 




    self.AutocCompleteStocks.isHidden = false 

    getStockName = stockEntryTextField.text! 



    print("kichuuuuu\(getStockName)") 


    //Calling web service 

    Alamofire.request("http://search.xignite.com/Search/Suggest?parameter=XigniteGlobalQuotes.GetGlobalDelayedQuote.Identifier&term=\(getStockName)&tags=xnse").responseJSON{response in 

     if let json = response.result.value as? [String:AnyObject]{ 

      if let results = json["Results"]{ 

       print(" \(results)") 

       //looping through all the values 

       for i in 0..<results.count{ 

        let item = results[i] as! [String:AnyObject] 

        let value = item["Value"] as! String 

        let text = item["Text"] as! String 

        self.stockValues.append(text) 


        //reloading the tableview after appending values 



       } 
       self.AutocCompleteStocks.reloadData() 
       print("TejastockValues\(self.stockValues)") 

      } 
     } 
    } 

    DispatchQueue.main.async{ 

     self.AutocCompleteStocks.reloadData() 

    } 
    stockValues = [""] 

} 
+0

DispatchQueue.main.asyncは存在してはいけません –

1

あなたはいつもmainスレッド上で、バックグラウンドスレッドからtableViewをリロードするべきではありません。あなたはstockValueに値を追加している間にtableViewをリロードしているため

はまた、あなたが持っている多くの値として、tableView何度でもをリロードします。しかし、一度すべてのアイテムを持たなければ、それを行うべきではありません。

は、あなたのforループで次の操作を行います。

for i in 0..<results.count { 
    let item = results[i] as! [String:AnyObject] 
    let value = item["Value"] as! String 
    self.stockValues.append(value) 
} 

DispatchQueue.main.async { [weak self] in 
    //Reloading the tableview after ALL values appended. 
    self?.AutocCompleteStocks.reloadData() 
} 
関連する問題