更改数组后无法在 Tableview 中重新加载数据?

Posted

技术标签:

【中文标题】更改数组后无法在 Tableview 中重新加载数据?【英文标题】:Not able to reload data in Tableview after an array is changed? 【发布时间】:2017-01-06 08:56:10 【问题描述】:

我正在尝试使用 API 自动完成文本字段(用于全球股票自动完成)。 当用户点击文本字段并开始编辑它时,将显示来自响应的所有数组值的表格视图。当用户第一次编辑文本字段时,我能够填充表格视图,但后来表格视图数据没有改变。 但我尝试打印我的数组,数组中的值会根据 UITextField 中输入的字符串发生变化。

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").responseJSONresponse 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()                                


【问题讨论】:

首先你需要在for循环之后重新加载tableView,而不是在循环的每次迭代中,还要在Main thread上重新加载tableView,就像这个***.com/a/41478738/6433023 【参考方案1】:

您不应从后台线程重新加载tableView,始终在main 线程上。

此外,因为您在将值附加到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()

【讨论】:

【参考方案2】:

当 UIText 字段发生更改时,您将值附加到 stockValues 中而不清除它。做类似的事情

TextField 事件中的 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").responseJSONresponse 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 = [""]


【讨论】:

DispatchQueue.main.async 不应该存在

以上是关于更改数组后无法在 Tableview 中重新加载数据?的主要内容,如果未能解决你的问题,请参考以下文章

更改数据和 popViewController 后 TableView 不会重新加载

Swift - 添加到数组后 tableView 不重新加载

解析查询后在哪里重新加载 UITableView 数据

Swift - 第二次加载后 Tableview 无法正确重新加载

无法重新加载 UITableView

Miles Away 没有在重新加载时更新