ReloadData()不刷新TableView

时间:2017-11-05 02:57:48

标签: ios arrays swift uitableview

我有一个文本字段,当我输入一个单词时,然后按一个按钮应该在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不会重新加载(我确信它确实如此,我只是犯了一个容易的错误! )..有什么想法吗?

编辑:好的,事实证明你必须从桌面视图中拖动IBOutlet。我之前没有这样做的原因是因为我观看了一段视频而且他的工作没有建立联系。

6 个答案:

答案 0 :(得分:3)

您应该详细了解表格视图&这个怎么运作。请参阅Apple文档Creating and Configuring a Table View

此处方法cellForRowAt是表视图的数据源,当需要填充单元格数据时,它会自动从tableview触发。您无法手动调用此方法。在@IBAction func addButton()中实现此方法不会做任何事情。函数总是需要从另一个方法调用。因此,您应该删除cellForRowAt内的@IBAction func addButton()

解决方案:从故事板获取表格视图插座。如果需要帮助,请参阅此处Connect the UI to Code

@IBOutlet weak var tableView: UITableView?

然后在viewDidLoad()

中设置tableview数据源和委托
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
    }
}

答案 1 :(得分:2)

您必须从

中删除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
 }

希望它有所帮助。

答案 2 :(得分:2)

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

enter image description here

首先,您缺少对IBOulet的{​​{1}}引用。创建一个,您可以在该插座中调用tableview方法。

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

因此,您的reloadData()应该只获取IBaction中的值并将其添加到数组中,最后调用textfield,这将调用reloadData()

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

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

enter image description here

答案 3 :(得分:0)

您可以通过向名称数组添加属性观察器来实现此目的。如果值有任何更改,则会运行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)**
            }

        }

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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