更新 tableview 绑定到数组错误

Posted

技术标签:

【中文标题】更新 tableview 绑定到数组错误【英文标题】:Updating tableview binded to array error 【发布时间】:2018-06-10 17:29:44 【问题描述】:

我对 Swift 非常陌生,所以我猜这是一个新手错误,但这是我的情况:

我正在尝试创建一个允许您将内容添加到列表的应用程序。我有一个NSTextField,用户在其中输入数据和一个NSButton,用于将该数据添加到myTeam 数组中。 tableView 被绑定(我认为这就是你所说的)到 myTeam 数组。

当我运行应用程序时,包含myTeam 的预设值的表会正确填充表视图,但是当我添加到此数组时,没有任何反应。经过研究,我找到了this question。

不幸的是,就像大多数快速教程和问答一样,它是针对 ios 的。但我想我会试一试。我加了

self.tableView.reloadData()
self.refresher.endRefreshing()

我的代码,收到两个错误:Value of type '(NSTableView, NSTableColumn?, Int) -> Any?' has no member 'reloadData'Value of type 'ViewController' has no member 'refresher',分别。

下面是我的代码:

import Cocoa
import Darwin

class ViewController: NSViewController, NSTableViewDataSource 
 var myTeam = ["Test", "Test2"]



    @IBOutlet weak var myText: NSTextField!
    @IBOutlet weak var AddMember: NSButton!

    @IBAction func addmem(_ sender: Any) 
        myTeam.append(myText.stringValue);
        self.tableView.reloadData()
        self.refresher.endRefreshing()

    
    override func viewDidLoad() 
        super.viewDidLoad()


    

    override var representedObject: Any? 
        didSet 
        // Update the view, if already loaded.
        
    
    // MARK: DataSource
    func numberOfRows(in tableView: NSTableView) -> Int 
        return myTeam.count
    
    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? 
        return myTeam[row]
    

附:我使用this 教程来达到我所做的那样。

【问题讨论】:

导入 Cocoa 不需要导入 Darwin @LeoDabus 好的。在教程中看到我应该添加它。谢谢。 【参考方案1】:

最简单的解决方案,我们将使用(完整的)Cocoa Bindings:

替换整个代码
import Cocoa

class ViewController: NSViewController  

    @IBOutlet weak var myText: NSTextField!

    @objc dynamic var myTeam = ["Test", "Test2"]

    @IBAction func addmem(_ sender: NSButton) 
        myTeam.append(myText.stringValue)
    

在 Interface Builder 中选择表格视图(不是封闭的滚动视图)并按 ⌥⌘6(连接检查器)

断开连接dataSource⌥⌘7(绑定检查器) 将内容绑定到ViewController > 模型键路径 myTeam

由于您仍在使用objectValueFor,我假设表格单元格视图的值已经绑定到objectValue

macOS 不知道复习。

【讨论】:

完美!谢谢。快速提问。你能解释一下你的代码吗?我真的不明白其中的大部分。比如我删除了@objc dynamic,屏幕是空白的。 Cocoa Bindings 是一个使用 Key-Value-Observing 的功能。如果观察到的对象已更改,则绑定值会自动更新。要启用 KVO,需要将数据源数组声明为 @objc dynamic 知道了。完美。

以上是关于更新 tableview 绑定到数组错误的主要内容,如果未能解决你的问题,请参考以下文章

从模型中自动更新 TableView 中的行

角材料表数据源未正确绑定/更新,没有错误但没有任何作用

将对象添加到数组后,tableview 不会更新

Vue V-用于将数组绑定到错误的组件

搜索时tableview错误

Tableview 中的 Xcode 核心数据