You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xcode 10.1中创建使用NSTableView?含连接问题与增删刷新

NSTableView 连接问题及增删刷新操作指南

一、获取嵌套在 NSScrollView 中的 NSTableView

在 Cocoa 框架中,拖拽 NSTableView 到窗口时,系统会自动将其包裹在 NSScrollView 内,所以直接连线会得到 NSScrollView 实例。可通过以下两种方式获取内部的 NSTableView:

1. 代码方式获取(纯代码创建场景)

如果完全通过代码搭建视图层级:

// 假设已创建 scrollView 实例
if let tableView = scrollView.documentView as? NSTableView {
    // 配置代理与数据源
    tableView.delegate = self
    tableView.dataSource = self
    // 后续可进行列配置等操作
}

2. XIB 中手动选择子视图(非 Storyboard 场景)

  • 打开 XIB 文件,在右侧 Document Outline 面板展开 NSScrollView 的层级结构
  • 找到嵌套在内的 NSTableView,直接拖拽到你的视图控制器类中创建 IBOutlet 连线

二、NSTableView 插入、删除与刷新方法

操作前需确保已正确设置 NSTableViewDataSource 代理,并维护好对应的数据源数组(例如 var dataSource: [String] = [])

1. 插入行

// 1. 先更新数据源
dataSource.insert("新条目", at: 0)
// 2. 通知表格插入指定行
tableView.insertRows(at: IndexSet(integer: 0), withAnimation: .effectFade)
  • IndexSet 支持指定多个行索引,例如 IndexSet(integersIn: 0..<3) 可插入多行
  • 动画参数可传 .none 取消动画效果

2. 删除行

// 1. 先更新数据源
guard !dataSource.isEmpty else { return }
dataSource.remove(at: 0)
// 2. 通知表格删除指定行
tableView.removeRows(at: IndexSet(integer: 0), withAnimation: .effectFade)

注意:必须先修改数据源,再调用表格的删除方法,否则会因数据不一致导致崩溃

3. 刷新表格

刷新全部行

tableView.reloadData()

刷新指定行/列

// 刷新索引为 0、2 的行,且仅刷新第一列
tableView.reloadData(forRowIndexes: IndexSet([0, 2]), columnIndexes: IndexSet(integer: 0))
  • 若需刷新所有列,可传入 IndexSet(integersIn: 0..<tableView.numberOfColumns)

三、纯代码创建 NSTableView 基础示例

如果完全不使用 XIB,可参考以下代码搭建基础表格:

class YourViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
    private var dataSource: [String] = ["条目1", "条目2", "条目3"]
    private var tableView: NSTableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 创建滚动视图
        let scrollView = NSScrollView(frame: view.bounds)
        scrollView.autoresizingMask = [.width, .height]
        view.addSubview(scrollView)
        
        // 创建表格视图
        tableView = NSTableView(frame: scrollView.bounds)
        tableView.autoresizingMask = [.width, .height]
        tableView.dataSource = self
        tableView.delegate = self
        
        // 添加表格列
        let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "ContentColumn"))
        column.title = "内容"
        tableView.addTableColumn(column)
        
        // 将表格绑定到滚动视图
        scrollView.documentView = tableView
    }

    // MARK: - NSTableViewDataSource
    func numberOfRows(in tableView: NSTableView) -> Int {
        return dataSource.count
    }

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
        return dataSource[row]
    }
}

内容的提问来源于stack exchange,提问作者user20295456

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:30:59