2017-01-06 6 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

Прежде всего, необходимо перезагрузить 'tableView' после цикл не внутри каждой итерации цикла, а также перезагружать' 'tableView' на главном thread', как этот http://stackoverflow.com/a/41478738/6433023 –

ответ

0

Вы добавление значения в stockValues ​​без очистки, когда происходит изменение в поле UIText. Сделайте что-нибудь наподобие

stockValues ​​= [""] в случае изменения события TextField, тогда он должен работать как указано. И также перезагрузите tableView в Основной поток, как предлагал Nirav D.

@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

Вы не должны перезагрузить tableView из фонового потока, всегда на main нити.

Кроме того, поскольку вы перезагрузки tableView в то время как вы добавления значения stockValue, вы перезагрузить 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() 
}