ReloadData() 不刷新 TableView

Posted

技术标签:

【中文标题】ReloadData() 不刷新 TableView【英文标题】:ReloadData() Not Refreshing TableView 【发布时间】:2017-11-05 02:57:47 【问题描述】:

我有一个文本字段,当我输入一个单词时,然后按下一个按钮应该将单词添加到 tableview。我知道数组正在更新,因为在按下按钮后,带有新值的数组在控制台中打印得很好。我已经在几个地方尝试过 reloadData() ,但它什么也没做。这是我的代码:

import UIKit
class Arraytest: UIViewController, UITableViewDelegate, UITableViewDataSource 
    @IBOutlet weak var textField: UITextField?
    var names = ["Jack", "Andy", "Guy", "Bruce", "Nick", "James", "Dominick"]
    @IBAction func addButton(_ sender: Any) 
        let name : String = textField!.text!
        names.append(name)
        textField?.text! = ""
        for guy in names
            **print(guy)**
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
            let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
            cell.textLabel?.text = names[indexPath.row]
            ***tableView.reloadData()***
            return cell
        
    
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return names.count
    
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
        cell.textLabel?.text = names[indexPath.row]
        return cell
    

假设我在文本字段中输入 John,这是控制台打印的内容:

Jack
Andy
Guy
Bruce
Nick
James
Dominick
John

我知道数组工作正常,但不是为什么当每个人都声称 reloadData() 工作时 tableView 不会重新加载(我确定它确实有效,我只是犯了一个简单的错误!)..有什么想法吗?

编辑:好的,事实证明您确实必须从 tableview 中拖动 IBOutlet。我之前没有这样做的原因是因为我观看了一个视频并且他在没有建立连接的情况下工作。

【问题讨论】:

add entires from textfield to UITableView to automatically populate的可能重复 【参考方案1】:

您应该了解有关表格视图及其工作原理的更多信息。请参阅 Apple 文档Creating and Configuring a Table View

这里cellForRowAt方法是tableview的数据源,当需要填充单元格数据时,它会自动从tableview中触发。您无法手动调用此方法。在@IBAction func addButton() 中实现这个方法没有任何作用。函数总是需要从另一个方法调用。所以你应该删除@IBAction func addButton()里面的cellForRowAt

解决方案: 从情节提要中获取表格视图插座。如果需要帮助请看这里Connect the UI to Code

@IBOutlet weak var tableView: UITableView?

然后在viewDidLoad()中设置tableview数据源和delegate

override func viewDidLoad() 
    super.viewDidLoad()
    tableView?.dataSource = self;
    tableView?.delegate = self;

最后更新@IBAction func addButton()如下

@IBAction func addButton(_ sender: Any) 
    let name : String = textField!.text!
    names.append(name)
    textField?.text! = ""
    for guy in names
        print(guy)
    

    tableView?.reloadData()

完整的源代码可能如下所示:

import UIKit
class Arraytest: UIViewController, UITableViewDelegate, UITableViewDataSource 
    @IBOutlet weak var textField: UITextField?
    @IBOutlet weak var tableView: UITableView?

    var names = ["Jack", "Andy", "Guy", "Bruce", "Nick", "James", "Dominick"]

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView?.dataSource = self;
        tableView?.delegate = self;
    

    @IBAction func addButton(_ sender: Any) 
        let name : String = textField!.text!
        names.append(name)
        textField?.text! = ""
        for guy in names
            **print(guy)**
        

        tableView?.reloadData()
    

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return names.count
    

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
        cell.textLabel?.text = names[indexPath.row]
        return cell
    

【讨论】:

【参考方案2】:

您的代码有两个非常大的错误(假设您的 tableview 委托已正确连接到您的 viewcontroller)。

首先你缺少一个IBOulet 对你的tableview 的引用。创建一个,您可以在该插座中调用reloadData() 方法。

其次,您不应该在您的IBAction 中调用public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 委托方法。它是一个委托方法,它已经在监听将触发其逻辑的事件或命令,在本例中为 reloadData()

所以你的IBaction 应该只从textfield 中获取值并将其添加到数组中,最后调用reloadData(),这将调用public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

此代码有效...希望对您有所帮助:

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var tableview: UITableView!
    @IBOutlet weak var textField: UITextField?

    var names = ["Jack", "Andy", "Guy", "Bruce", "Nick", "James", "Dominick"]

    // MARK: tableview delegate methods
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return names.count
    
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell")
        cell.textLabel?.text = names[indexPath.row]
        return cell
    

    // MARK: ibactions

    @IBAction func addButton(_ sender: Any) 
        let name : String = textField!.text!
        names.append(name)
        textField?.text! = ""            
        tableview.reloadData()
    

【讨论】:

这很有趣,因为我在 Youtube 上观看了 The Swift Guy 的视频,他连接了数据源和委托属性,但 tableView 没有@IBOutlet! 很高兴我能帮上忙。快乐编码【参考方案3】:

您必须从

中删除 TableView 委托方法
@IBAction func addButton(_ sender: Any) 

方法&把它放在外面。像这样创建这个 tableView 表单故事板的属性

@IBOutlet weak var tableView: UITableView!

在 viewDidload 方法中像这样设置数据源和委托

override func viewDidLoad() 
    super.viewDidLoad()

    self.tableView.datasource = self
    self.tableView.delegate = self
 

希望对你有帮助。

【讨论】:

【参考方案4】:

您可以通过将属性观察器添加到名称数组来实现此目的。如果值有任何更改, didset 方法将运行。

  class Arraytest: UIViewController, UITableViewDelegate UITableViewDatasource 
     var names = ["Jack", "Andy", "Guy", "Bruce", "Nick", "James", "Dominick"] 
        didSet 
            self.tableView.reloadData();
        
      
   

addButton func 中的 tableview func 不运行.. 将其删除并保持如下:

@IBAction func addButton(_ sender: Any) 
            let name : String = textField!.text!
            names.append(name)
            textField?.text! = ""
            for guy in names
                **print(guy)**
            

        

【讨论】:

当我尝试这样做时出现此错误:对成员'tableView(_:numberOfRowsInSection:)'的模糊引用 @PeteHornsby 我以前从未尝试过使用扩展程序做任何事情?你能解释一下我应该怎么做吗?【参考方案5】:

您必须将您的 tableview func 放在 @IBAction func addButton 之外,因为它是 uitableviewdatasource 的一部分,并且需要显示您的单元格。之后,您只需将tableView.reloadData() 放在for guy in names ... 循环之后。

【讨论】:

【参考方案6】:

将连接从拆分视图控制器拖到您的视图控制器并使用 reloadData()。

【讨论】:

以上是关于ReloadData() 不刷新 TableView的主要内容,如果未能解决你的问题,请参考以下文章

在主线程上调用 tableView.reloadData 后 UITableView 不刷新

UITableView.reloadData() 没有刷新 tableView。没有错误信息

CollectionView 仅在 SVPullToRefresh 上刷新,不在 .reloadData 上刷新

使用 UICollectionView reloadData 问题刷新控件

collectionView使用reloadData和reloadItemsAtIndexPaths冲突

iOS UITableView reloadData 刷新结束后执行后续操作